用于MS ACCESS链接表的SQL用于转置行和列

时间:2017-09-27 01:17:26

标签: sql ms-access ms-access-2010

我在这里查看了许多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环境的限制,有没有办法更好地处理这个问题?非常感谢!

1 个答案:

答案 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

本质上,此查询包含两部分:

  1. 一个子查询,返回0到999之间的每个数字(技术改编自Gustav
  2. 外部查询,它从您的两个查询中返回指定的列号,并过滤子查询。
  3. 可以调整BETWEEN 1 And 200以适合您的样本

    如果需要更高的数字(0到9999),也可以调整子查询