2016-07-25 5 views
0

두 개의 데이터 소스를 쿼리하고 "이름"의 일반 필드에 왼쪽으로 결합 할 모듈을 VBA에 작성하려고합니다. 문제는 데이터가 다르게 세분된다는 것입니다.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

대단히 감사합니다! 나는 더 많은 원유를 처리하는 것을 끝내었다 : 나는 6 개 세트를 선언했다. 각 아이템은 현재/과거를위한 것이고, set2는 set1에, set3는 set2로 남겨둔 채 남겨둔다. 나를 위해 일한다고 제안한 곰팡이에서 쿼리를 얻는 것을 좋아했을 것이다. (나는 단지 그것을 작동시킬 수 없었다) 그러나 이것은 지금해야만 할 것이다. – helsinki86

관련 문제