2017-07-07 52 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 byIDDay)。

我可以添加兩個和?或者這是否超出了樞軸功能的範圍?以下產生一個錯誤:

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

如果您的數據每週有多個行,則此問題有效。這種情況會發生嗎?在這種情況下你會想要什麼結果? – Lamak

+0

@Lamak是真的,但這也會影響他的「常規查詢」,所以真的是數據問題 - 而不是一個關鍵問題。或者我誤解了? –

+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

你不想保留「Mrs Piet」和「Mr Name」代碼? :) –