2016-09-16 6 views
6

に対応する列を追加する方法:私は以下のようにそれを表示したいと思い私はテーブル持っているMicrosoft SQL Serverの2012</p> <p>を使用してPIVOTデータセット

PartID |TypeSet | Setting | ObservID |TransDate 
--------------------------------------------- 
1   A 456  12 10/20/2015 
1   A 377  12 10/20/2015 
1   A 425  12 10/20/2015 
1   A 665  12 10/20/2015 
1   A 543  12 10/20/2015 
1   A 554  12 10/20/2015 
1   B 34  41 10/21/2015 
1   B 27  41 10/21/2015 
1   B 27  41 10/21/2015 
1   B 29  41 10/21/2015 
1   C 1299  12 10/20/2015 
1   C 1227  12 10/20/2015 

を。 PartIDでグループ化された単一の行。

PartID | A Avg | B Avg | C Avg | A ObservID | B ObservID | C ObservID 
--------------------------------------------------------------------- 
    1  503  29  1263  12    41   12 

複数行のリターンデータセットを作成せずにObservIDを表示することはできません。私はこのクエリでA、BおよびCの平均に問題が全くない:

SELECT  
     PartID 
     ,[A] as 'A Average' 
     ,[B] as 'B Average' 
     ,[C] as 'C Average' 
    -- ,(ObservID) 
    --,CASE WHEN [A] = 'A Average' THEN max([ObservID]) END as 'A Ob' 
    --,CASE WHEN [B] = 'B Average' THEN max([ObservID]) END as 'B Ob' 
    -- ,CASE WHEN [C] = 'C Average' THEN max([ObservID]) END as 'C Ob' 
FROM 
(SELECT 
    PartID 
    ,TypeSet 
    ,Setting 
    --,ObservID 
    FROM #Temp1 
    ) as MeasData 
PIVOT 
(
    AVG(Setting) 
    FOR [TypeSet] in 
     ([A], [B], [C])  
) as PivotTable 

あなたが、私はそれにObservID取得しようとしましたが、私はこれらの行のコメントを解除するとき、エラーが発生する上記のクエリで見ることができます。 いくつかの注意:ObservIDは各タイプセットに対して一貫しています。ここで

はデータです:

create table #Temp1 
(
    PartID INT 
, TypeSet VARCHAR(10) 
, Setting INT 
, ObservID INT 
, TransDate Date 
) 

INSERT INTO #Temp1(PartID, TypeSet, Setting, ObservID, TransDate) VALUES 
    (1, 'A', 456, 12, '10/20/2015'), 
    (1, 'A', 377, 12, '10/20/2015'), 
    (1, 'A', 425, 12, '10/20/2015'), 
    (1, 'A', 665, 12, '10/20/2015'), 
    (1, 'A', 543, 12, '10/20/2015'), 
    (1, 'A', 554, 12, '10/20/2015'), 
    (1, 'B', 34, 41, '10/21/2015'), 
    (1, 'B', 27, 41, '10/21/2015'), 
    (1, 'B', 27, 41, '10/21/2015'), 
    (1, 'B', 29, 41, '10/21/2015'), 
    (1, 'C', 1299, 12, '10/20/2015'), 
    (1, 'C', 1227, 12, '10/20/2015') 

PIVOT操作で可能な私の所望の出力はありますか?または、各タイプセットのテーブルに複数のJOINのルートを設定する必要がありますか?

答えて

3

あなたは条件付き集約を使用してそれを行うことができます。

SELECT PartID, 
    AVG(CASE WHEN TypeSet = 'A' THEN Setting END) AS 'A Avg', 
    AVG(CASE WHEN TypeSet = 'B' THEN Setting END) AS 'B Avg', 
    AVG(CASE WHEN TypeSet = 'C' THEN Setting END) AS 'C Avg', 
    MAX(CASE WHEN TypeSet = 'A' THEN ObservID END) AS 'A ObservID', 
    MAX(CASE WHEN TypeSet = 'B' THEN ObservID END) AS 'B ObservID', 
    MAX(CASE WHEN TypeSet = 'C' THEN ObservID END) AS 'C ObservID' 
FROM #Temp1 
GROUP BY PartID 
+0

これは素晴らしいです。私に必要なものを手に入れよう。私の唯一の心配はパフォーマンスですが、同時に、私は説明計画を見直していません...しかし、これはありがとうございます。 – Charlie

+1

@Charlieこれは、 'PIVOT'を使っているどんなクエリよりも速くなければなりません。 'PIVOT'は実際には条件付き集約のための構文的砂糖です。 –

0
WITH avgPivot AS 
(
    SELECT 
     PartID,[a] as A_Avg,[b] as B_Avg,[c] as C_Avg 
    FROM 
    (
    SELECT PartID, TypeSet, Setting, ObservID 
    FROM #Temp1 
) As S 
    PIVOT 
    (
    AVG(Setting) 
    FOR TypeSet in([a],[b],[c]) 
) 
    AS pvt 
), 
maxPivot AS 
(
    SELECT 
     [a] as A_ObservID, [B]B_ObservID, [c] as c_ObservID 
    FROM 
    (
    SELECT PartID, TypeSet, Setting, ObservID 
    FROM #Temp1 
) As S 
    PIVOT 
    (
    max(ObservID) 
    FOR TypeSet in([a],[b],[c]) 
) 
    AS pvt 
) 

SELECT distinct * 
FROM avgPivot M 
cross JOIN maxPivot A 
+0

これは私にNULLを与え、複数行のデータセットを作成します。 – Charlie

+0

あなたは単一の行が必要です....... – Chanukya

+0

申し訳ありませんが、はい、PartID – Charlie

関連する問題