![](/img/trans.png)
[英]Break the Hierarchy in a column into multiple columns recursively using SQL
[英]SQL: break column into multiple columns by cell value
我正在尝试在VBA中构建一个模块,该模块将查询2个数据源,并在“名称”的公共字段上将它们连接起来。 问题在于数据的粒度不同。 我目前要更改的集合如下所示:
我正在尝试使其看起来像这样:
这样我就可以通过第二个数据集中的查询将其连接起来,该查询按“名称”而不是“项目值”进行细化。
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;
在此先感谢您提供的任何指导!
因此,您有两种选择。 首先是尝试改写枢轴以获得所需的结果,这使查询变得比所需的更为复杂。 您可以按照以下方式进行操作:
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;
我真的不认为CTE使查询更具可读性,所以我只是删除了它们,但是您可以根据需要以类似的方式使用CTE。
更好(更容易理解)的方式是只使用条件聚合,例如:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.