我在这里查看了许多SQL转置线程,所有这些都涉及重组数据和/或数据摘要。我有一种与某些情况不符的常见情况。 请记住,这是在MS Access中,并使用链接表(因此,不允许更新,没有密钥或ID)。
我有链表。只有两行长的数据。 比如说,它是一个独特的业务单位(BU)列表和相应的年销售额。
linked_table
F1 F2 F3 F4 F5 ...
-----------------------------
row1 BU11 BU123 BU223 BU2 BU432...
row2 $2345 $0 $50.50 $234 $567.22
我需要将此数据集以某种方式转换为:
new_table or new_query
BU Sales
---------------
BU11 $2345
BU123 $0
BU223 $50.50
BU2 $234
BU342 $567.22
...
同样,链接的Access表中只有两行长数据。 我只是发现了一个非常乏味和丑陋的方法,并且想知道是否有更好的方法来做到这一点。
第1步 我已将两行数据分成两个单独的查询
headers_qry
F1 F2 F3 F4 F5...
------------------------------
row1 BU11 BU123 BU223 BU2 BU432...
data_qry
F1 F2 F3 F4 F5...
------------------------------
row1 $2345 $0 $50.50 $234 $567.22...
然后我将一个虚拟的“公共密钥”硬编码到两个数据集中
headers_qry
F1 F2 F3 F4 F5... KEY
----------------------------------------------
row1 BU11 BU123 BU223 BU2 BU432... UNIQUE123
data_qry
F1 F2 F3 F4 F5... KEY
-----------------------------------------------
row1 $2345 $0 $50.50 $234 $567.22... UNIQUE123
然后,我在该公共密钥上的两个查询之间添加了一个连接,并通过数百个UNION语句手动配对Header和Data对。哎哟!!!!
SELECT
headers.F1 AS BU_Number,
data.F1 AS BU_Sales
FROM header_data_join_qry UNION ALL
SELECT
headers.F2 AS BU_Number,
data.F2 AS BU_Sales
FROM header_data_join_qry UNION ALL
SELECT
...
headers.F100 AS BU_Number,
data.F100 AS BU_Sales
FROM header_data_join_qry UNION ALL;
这不仅繁琐而丑陋,MS ACCESS无法处理这些多个UNION ALL查询,一旦达到100左右,就开始给出SQL语句过于复杂的错误。
考虑到链接源表和MS ACCESS SQL环境的限制,有没有办法更好地处理这个问题?非常感谢!
答案 0 :(得分:1)
您可以尝试以下方法。
从分隔两行数据的起始位置,不需要公共密钥(因为它们都是一行)。
SELECT DLookUp("F" & Number, "headers_qry") AS BU, DLookUp("F" & Number, "data_qry") As Sales
FROM (
SELECT DISTINCT Abs(Ones.ID Mod 10) + Abs(Tens.ID Mod 10) * 10 + Abs(Hundreds.ID Mod 10)*100 As Number
FROM MSysObjects As Ones, MSysObjects As Tens, MSysObjects As Hundreds
) As NumbersQuery
WHERE Number BETWEEN 1 And 200
本质上,此查询包含两部分:
可以调整BETWEEN 1 And 200
以适合您的样本
如果需要更高的数字(0到9999),也可以调整子查询