Access SQL中的Unpivot

时间:2016-10-06 01:35:08

标签: sql ms-access unpivot

大家好我想在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服务器的语法有所不同?如果有人能告诉我如何运行此代码,我将非常感激。

2 个答案:

答案 0 :(得分:3)

只需使用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

答案 1 :(得分:0)

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

如果该表已经在Access中(与链接数据源脱离)或者没有通过pass-thru支持,则可能会有效。它非常强大,但是如果你用一个名为ID的字段创建一个表(在这个例子中称之为#34;序列"):

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中的等价物。