2017-09-27 79 views
1

我在这里查看了一些SQL转置线程,并且它们都处理重构数据和/或数据摘要。我有一种常见的情况,与这些情况不符。 请记住,这是在MS Access中,并使用链接表(所以,没有允许更新,没有密钥或ID)。用于MS ACCESS链接表的SQL转置行和列

我有链接表。只有两行很长的数据。假设,这是一个独特的业务单元(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 
... 

同样,也有只有两个链接访问表数据的长排。 我只找到一个非常单调乏味的方法来解决这个问题,并且想知道是否有更好的方法来做到这一点。

STEP 1 我数据的两行分离成2个单独的查询

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

你起身100,以适应你的样品

?我认为50是UNION中SELECT行的限制。我知道的唯一选择是VBA将记录写入临时表 - 表是永久的,数据是临时的。 – June7

+0

看看第三个答案[here](https:// stackoverflow。COM /问题/ 7255423 /如何对模拟-逆转置式访问-2010)。也许它会帮助你 – cha

+0

本质上分为2个子查询,我达到了100。在那之后,我还会联合这两人。这就提高了总共50个以上的ACCESS容差... –

回答

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 

本质上,此查询有2个部分组成:

  1. 返回0和999(技术改编自Gustav
  2. 从返回指定列数的外部查询之间的每一个号码的子查询包括您的查询和筛选子查询。

BETWEEN 1 And 200可以适应如果更高的数字需要(0〜9999),子查询也可以适应

+0

这是fyre。谢谢! –

+0

@CamCall如果这已回答您的问题,请将答案标记为已接受。阅读[这里](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)了解它的工作原理,以及它的优点。 –

+0

我必须说,在它返回记录之前,它在无响应状态下运行了10分钟。 –