2017-07-07 8 views
-1

私が見た例のほとんどは複雑ですので、私はpivotの概念を完全に理解するのに簡単なものを投稿したと思います。PIVOTを理解していますか?

私の理解から
declare @yt TABLE 
(
    Id int, 
    Dept varchar(10), 
    [Day] int, 
    [Counter] int 
); 

INSERT INTO @yt 
(
    ID, Dept, [Day], [Counter] 
) 
VALUES 
    (102, 'DeptA', 20170704, 96), 
    (102, 'DeptP', 20170704, 223), 
    (103, 'DeptA', 20170704, 84), 
    (103, 'DeptW', 20170704, 43); 

select * 
from 
(
    select id, dept, [day], [Counter] 
    from @yt 
) src 
pivot 
(
    sum([Counter]) 
    for Dept in ([DeptA], [DeptP], [DeptW]) 
) piv; 

Pivot内のコードは次のことを行います。1)、選択した列(sum([counter]))を集約しfor Deptで列を旋回した後、(指定されていない残りの列のgroup byを行いますIDおよびDay)。

2つの合計を追加できますか?または、これはピボット機能の範囲を超えたものですか?以下は、エラーを生成します。

declare @yt TABLE 
(
    Id int, 
    Dept varchar(10), 
    [Day] int, 
    [Counter] int, 
    Sales int 
); 

INSERT INTO @yt 
(
    ID, Dept, [Day], [Counter], Sales 
) 
VALUES 
    (102, 'DeptA', 20170704, 96, 12), 
    (102, 'DeptP', 20170704, 223, 5), 
    (103, 'DeptA', 20170704, 84, 9), 
    (103, 'DeptW', 20170704, 43, 11); 

select * 
from 
(
    select id, dept, [day], [Counter], sales 
    from @yt 
) src 
pivot 
(
    sum([Counter]), ([sales]) 
    for Dept in ([DeptA], [DeptP], [DeptW]) 
) piv; 

この質問はpivot tablesを理解するのに役立ったことを追加したいです。

+0

この懸案事項は、データに1週間に複数の行が格納できる場合に有効です。それは起こることができますか?その場合、どんな結果が望めますか? – Lamak

+0

@Lamak trueですが、それは彼の「通常のクエリ」にも影響するため、実際にはデータ問題です。ピボットの問題ではありません。あるいは私は誤解していますか? –

+0

@StanShawいいえ、そうですが、私はちょうど有効な懸念を理解しようとしています – Lamak

答えて

0

行が一意であることを保証することによって、集計操作をいつでも防ぐことができます。 集計{SUM | MIN | MAX}は構文内にまだ存在していなければなりませんが、行が一意の場合は、実際に複数の行を操作することはできません。

大きな問題は、複数の行がある場合に起こりたいことです。以下のケースでは、ソース行を1つ複製し、コードを実行することによってどのように表示されるかを確認します。追加の行を無視する場合は、「where r = 1」を追加するだけです。

declare @yt TABLE 
(
    [Store] int, 
    [Week] int, 
    [xCount] int 
); 

INSERT INTO @yt 
(
    [Store], 
    [Week], [xCount] 
) 
VALUES 
    (102, 1, 96), 
    (101, 1, 138), 
    (105, 1, 37), 
    (109, 1, 59), 
    (101, 2, 282), 
    (102, 2, 212), 
    (105, 2, 78), 
    (105, 2, 78), 
    (109, 2, 97), 
    (105, 3, 60), 
    (102, 3, 123), 
    (101, 3, 220), 
    (109, 3, 87); 

select piv.Store , 
     piv.[1] , 
     piv.[2] , 
     piv.[3] 
from 
(
    select store, week, xCount,row_number() over(partition by Store,Week order by Store) R 
    from @yt 
) src 
pivot 
(
    sum(xcount) 
    for week in ([1], [2], [3]) 
) piv; 
+0

"Piet夫人"と "氏氏"のコードを保持したくないですか? :) –

関連する問題