2016-07-25 5 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; 

Я не думаю, 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; 
+0

Большое спасибо! Я закончил делать что-то гораздо более грубое: я объявил шесть наборов, по одному для каждого элемента current/past, а затем присоединил set2 к set1, set3 к set2 и т. Д. Было бы интересно получить запрос в форме, которую вы предложили мне для работы (Я просто не мог заставить его работать), но сейчас это нужно будет сделать. – helsinki86

Смежные вопросы