繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM