Access SQL 中的反透视

Posted

技术标签:

【中文标题】Access SQL 中的反透视【英文标题】:Unpivot in Access SQL 【发布时间】:2016-10-06 01:35:07 【问题描述】:

大家好,我正在尝试在 MS Access 上的 SQL 中使用 unpivot,我在网上找到了以下代码:

SELECT CustomerID, Phone
FROM
(
  SELECT CustomerID, Phone1, Phone2, Phone3 
  FROM dbo.CustomerPhones
) AS cp
UNPIVOT 
(
  Phone FOR Phones IN (Phone1, Phone2, Phone3)
) AS up;

来自此网页: https://www.mssqltips.com/sqlservertip/3000/use-sql-servers-unpivot-operator-to-help-normalize-output/

但是,当我在 Access 上尝试完全相同的代码时,它一直说 FROM 子句有错误。

我想知道这是否是因为访问语法与 SQL Server 中的语法有所不同?如果有人能告诉我如何使这段代码运行,我将不胜感激。

【问题讨论】:

Access 没有内置的UNPIVOT 功能,q.v. here。如果您包含示例数据,有人可能会为您提供解决方法。 【参考方案1】:

只需使用union all:

SELECT CustomerID, Phone1 as Phone
FROM dbo.CustomerPhones
UNION ALL
SELECT CustomerID, Phone2 as Phone
FROM dbo.CustomerPhones
UNION ALL
SELECT CustomerID, Phone3 as Phone
FROM dbo.CustomerPhones;

如果您想产生删除重复项的开销,请使用UNION

【讨论】:

@onedaywhen 。 . .问题中的unpivot 将返回重复项。【参考方案2】:

请记住,如果您真的是从实际数据库中读取数据,则可以通过使用 pass-thru 而不是特定于 Access 的查询来利用所有 RDMBS 特定的功能(在本例中为 MS SQL Server)。你唯一失去的是设计工具。我的意思是,您可以按原样将查询粘贴到 Access 中,并像使用任何其他 Access 查询一样使用它。

如果表已经在 Access 中(从链接的数据源分离)或者不支持通过 pass-thru,这可能有效。这是相当蛮力的,但是如果您创建一个表(在本例中称为“序列”),其中包含一个名为 ID 的字段:

ID
1
2
3

然后您可以对您的电话表进行交叉(笛卡尔)联接:

select
  p.[CustomerId],
  s.[ID],
  switch (
    s.[ID] = 1, p.[Phone1],
    s.[ID] = 2, p.[Phone2],
    s.[ID] = 3, p.[Phone3]
  ) as Phone
from
  [CustomerPhones] as p,
  [Sequence] as s

序列表可能有另一种解决方法...... Postgresql 有一个名为 generate_series 的函数,它会很完美,但我不知道 Access 中的等价物。

【讨论】:

以上是关于Access SQL 中的反透视的主要内容,如果未能解决你的问题,请参考以下文章

Access SQL:按自定义案例排序,按月透视

使用 MS Access Query 反透视或转换数据

MS Access 中的透视查询

MS Access 中的透视查询

SQL Server 中的反透视表

Databricks/Spark SQL 中的反透视表