所以,你有几个选项。首先是尝试对数据透视表进行重新命名以获得您想要的结果,这使得查询比所需要的更复杂。如果你愿意,你可以通过以下方式做到这一点:
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;
来源
2016-07-25 22:40:55
ZLK
非常感谢您!我最终做了一些更粗糙的事情:我宣布了六套,一套用于当前/过去的每件商品,然后将set2加入set1,set3加入set2等。如果您喜欢在您建议为我工作的模具中获得查询(我只是无法让它工作),但现在必须做。 – helsinki86