SQL 用于 MS ACCESS 链接 table 以转置行和列
SQL for MS ACCESS linked table to transpose rows and columns
我在这里查看了许多 SQL 转置线程,它们都处理重组数据 and/or 数据摘要。我有一个不符合任何这些情况的常见情况。
请记住这是在 MS Access 中,并使用链接 table(因此,不允许更新,也没有密钥或 ID)。
我有链接table。只有两行长数据。
比方说,它是独特业务单位 (BU) 和相应年销售额的列表。
linked_table
F1 F2 F3 F4 F5 ...
-----------------------------
row1 BU11 BU123 BU223 BU2 BU432...
row2 45 [=12=] .50 4 7.22
我需要将此数据集以某种方式转换为:
new_table or new_query
BU Sales
---------------
BU11 45
BU123 [=13=]
BU223 .50
BU2 4
BU342 7.22
...
同样,链接的 Access 中只有两行长数据 table。
我只找到了一种非常乏味和丑陋的方法来解决这个问题,并且想知道是否有更好的方法来做到这一点。
第一步
我已将两行数据分成 2 个单独的查询
headers_qry
F1 F2 F3 F4 F5...
------------------------------
row1 BU11 BU123 BU223 BU2 BU432...
data_qry
F1 F2 F3 F4 F5...
------------------------------
row1 45 [=14=] .50 4 7.22...
然后我将虚拟 "common key" 硬编码到两个数据集中
headers_qry
F1 F2 F3 F4 F5... KEY
----------------------------------------------
row1 BU11 BU123 BU223 BU2 BU432... UNIQUE123
data_qry
F1 F2 F3 F4 F5... KEY
-----------------------------------------------
row1 45 [=15=] .50 4 7.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 语句太复杂的错误。
考虑到链接源 table 和 MS ACCESS SQL 环境的局限性,有没有办法更好地处理这个问题?非常感谢!
你可以试试下面的方法。
从您分隔两行数据的起始位置开始,不需要公共键(因为它们都是一行)。
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
基本上,这个查询有两个部分:
- returns 0 到 999 之间的每个数字的子查询(技术改编自 Gustav)
- 一个外部查询,它 returns 来自两个查询的指定列号,并过滤子查询。
BETWEEN 1 And 200
可以根据您的样本进行调整
如果需要更大的数字(0 到 9999),也可以修改子查询
我在这里查看了许多 SQL 转置线程,它们都处理重组数据 and/or 数据摘要。我有一个不符合任何这些情况的常见情况。 请记住这是在 MS Access 中,并使用链接 table(因此,不允许更新,也没有密钥或 ID)。
我有链接table。只有两行长数据。 比方说,它是独特业务单位 (BU) 和相应年销售额的列表。
linked_table
F1 F2 F3 F4 F5 ...
-----------------------------
row1 BU11 BU123 BU223 BU2 BU432...
row2 45 [=12=] .50 4 7.22
我需要将此数据集以某种方式转换为:
new_table or new_query
BU Sales
---------------
BU11 45
BU123 [=13=]
BU223 .50
BU2 4
BU342 7.22
...
同样,链接的 Access 中只有两行长数据 table。 我只找到了一种非常乏味和丑陋的方法来解决这个问题,并且想知道是否有更好的方法来做到这一点。
第一步 我已将两行数据分成 2 个单独的查询
headers_qry
F1 F2 F3 F4 F5...
------------------------------
row1 BU11 BU123 BU223 BU2 BU432...
data_qry
F1 F2 F3 F4 F5...
------------------------------
row1 45 [=14=] .50 4 7.22...
然后我将虚拟 "common key" 硬编码到两个数据集中
headers_qry
F1 F2 F3 F4 F5... KEY
----------------------------------------------
row1 BU11 BU123 BU223 BU2 BU432... UNIQUE123
data_qry
F1 F2 F3 F4 F5... KEY
-----------------------------------------------
row1 45 [=15=] .50 4 7.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 语句太复杂的错误。
考虑到链接源 table 和 MS ACCESS SQL 环境的局限性,有没有办法更好地处理这个问题?非常感谢!
你可以试试下面的方法。
从您分隔两行数据的起始位置开始,不需要公共键(因为它们都是一行)。
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
基本上,这个查询有两个部分:
- returns 0 到 999 之间的每个数字的子查询(技术改编自 Gustav)
- 一个外部查询,它 returns 来自两个查询的指定列号,并过滤子查询。
BETWEEN 1 And 200
可以根据您的样本进行调整
如果需要更大的数字(0 到 9999),也可以修改子查询