2016-07-25 17 views
0

2つのデータソースを照会し、「名前」の共通フィールドにそれらを結合するモジュールをVBAに作成しようとしています。問題は、データの粒度が異なることです。SQL:セルの値で列を複数の列に分割する

current

そして、私はそれがこのように見えるようにしようとしている:私はそれに参加残さできるようにするため

desired

私は現在、変更しようとしているセットは、このようになります私の2番目のデータセットからのクエリでは、 "item value"ではなく "name"によってグレイン化されています。

FWIW、私が現在実行しようとしているクエリは次のようになります。あなたが提供することができます任意の指導を事前に感謝を

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; 

:私は、暗黙的には、「現在の値」と各「名前」のための「過去値」を取得するために参加し使用していますが、これのどれも、データセット2を意味しません!

答えて

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は、クエリを読みやすくするとは思わないが、あなたが希望する場合は、同様の方法で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つのセットを宣言しました。各アイテムは現在/過去のアイテムごとに1つずつセットされ、次にset2をset1に、set3をset2にセットして残りました。 (私はちょうどそれを働かせることができませんでした)が、これは今のためにする必要があります。 – helsinki86

関連する問題