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 中的反透视的主要内容,如果未能解决你的问题,请参考以下文章