2016-07-25 32 views
0

我试图在VBA中构建一个模块,它将查询2个数据源,并将它们留在“名称”的公共字段上。问题在于数据的粒度不同。我想现在更改设置如下:SQL:按列值将列分成多个列

current

而且我想使它看起来像这样:

desired

所以,我可以离开它加入与从我的第二个数据集查询,这是由“名称”,而不是“项目价值”粒度。

FWIW,这是我正在尝试运行的查询的样子。我使用的是隐式连接,以获得每个“名字”,“当前值”和“过去的价值”,但这些都不是指数据集2:

with set1 as (SELECT NAME, ITEM_CODE, ITEM_VALUE_NUMBER as CURRENT_VALUE FROM [...] WHERE [...]), 
with set2 as (SELECT NAME, ITEM_CODE, ITEM_VALUE_NUMBER as PAST_VALUE FROM [...] WHERE [...]), 
SELECT set1.NAME [ITEM_1], [ITEM_2], [ITEM_3] from 
(SELECT set1.NAME, set1.CURRENT_VALUE, set2.PAST_VALUE FROM set1, set2 WHERE set1.NAME=set2.NAME and set1.ITEM_CODE=set2.ITEM_CODE) AS SourceTable 
PIVOT (max(CURRENT_VALUE) for ITEM_CODE in [ITEM_1], [ITEM_2], [ITEM_3]) AS PivotTable; 

预先感谢您能提供任何指导!

回答

1

所以,你有几个选项。首先是尝试对数据透视表进行重新命名以获得您想要的结果,这使得查询比所需要的更复杂。如果你愿意,你可以通过以下方式做到这一点:

SELECT Name 
    , MAX(C1) Item1CurrentValue 
    , MAX(P1) Item1PastValue 
    , MAX(C2) Item2CurrentValue 
    , MAX(P2) Item2PastValue 
    , MAX(C3) Item3CurrentValue 
    , MAX(P3) Item3PastValue 
FROM (
    SELECT set1.Name 
     , 'C' + CAST(set1.ItemCode AS VARCHAR(255)) ItemCode1 
     , CurVal 
     , 'P' + CAST(set2.ItemCode AS VARCHAR(255)) ItemCode2 
     , PastVal 
    FROM (SELECT Name, ItemCode, ITEM_VALUE_NUMBER CurVal FROM myFirstQuery) set1 
    JOIN (SELECT Name, ItemCode, ITEM_VALUE_NUMBER PastVal FROM mySecondQuery) set2 ON set1.Name = set2.Name AND set1.ItemCode = set2.ItemCode) T 
PIVOT (MAX(CurVal) FOR ItemCode1 IN (C1, C2, C3)) P1 
PIVOT (MAX(PastVal) FOR ItemCode2 IN (P1, P2, P3)) P2 
GROUP BY Name; 

我真的不认为热膨胀系数使查询更具可读性,所以我只是把他们赶走,但如果你愿意,你可以使用热膨胀系数以类似的方式。

更好的(和更容易理解,在我看来)的方式就是使用条件的聚集,像这样的:

SELECT Name 
    , MAX(CASE WHEN ItemCode = 1 THEN CurVal END) Item1CurrentValue 
    , MAX(CASE WHEN ItemCode = 1 THEN PastVal END) Item1PastValue 
    , MAX(CASE WHEN ItemCode = 2 THEN CurVal END) Item2CurrentValue 
    , MAX(CASE WHEN ItemCode = 2 THEN PastVal END) Item2PastValue 
    , MAX(CASE WHEN ItemCode = 3 THEN CurVal END) Item3CurrentValue 
    , MAX(CASE WHEN ItemCode = 3 THEN PastVal END) Item3PastValue 
FROM (
    SELECT set1.Name 
     , set1.ItemCode 
     , CurVal 
     , PastVal 
    FROM (SELECT Name, ItemCode, ITEM_VALUE_NUMBER CurVal FROM myFirstQuery) set1 
    JOIN (SELECT Name, ItemCode, ITEM_VALUE_NUMBER PastVal FROM mySecondQuery) set2 ON set1.Name = set2.Name AND set1.ItemCode = set2.ItemCode) T 
GROUP BY Name; 
+0

非常感谢您!我最终做了一些更粗糙的事情:我宣布了六套,一套用于当前/过去的每件商品,然后将set2加入set1,set3加入set2等。如果您喜欢在您建议为我工作的模具中获得查询(我只是无法让它工作),但现在必须做。 – helsinki86