2017-07-07 4 views
-1

Die meisten der Beispiele, die ich gesehen habe, sind komplexer, also denke ich, dass ich etwas Einfaches gepostet habe, um das Konzept von pivot vollständig zu verstehen.Pivot verstehen?

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; 

Von meinem Verständnis, der Code in Pivot geschieht Folgendes: 1) ausgewählt, um die Spalte Aggregate (sum([counter])), schwenkt die Säule in for Dept und führt dann eine group by der Rest der Spalten, die nicht angegeben sind (ID und Day).

Könnte ich zwei Summen hinzufügen? Oder ist das etwas, das über die Pivot-Funktionalität hinausgeht? Im Folgenden wird ein Fehler generiert:

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; 

hinzufügen wollte, dass diese Frage hilfreich war die pivot tables zu verstehen.

+0

Dieses Problem ist gültig, wenn Ihre Daten mehr als eine Zeile pro Woche speichern können. Kann das passieren ?, welches Ergebnis möchten Sie in diesem Fall? – Lamak

+0

@Lamak wahr, aber das würde auch Auswirkungen auf seine "normale Abfrage", also wirklich, es ist ein Datenproblem - und nicht ein Pivot-Problem. Oder bin ich falsch verstanden? –

+0

@StanShaw Nein, das ist richtig, aber ich versuche nur ein gültiges Anliegen zu verstehen – Lamak

Antwort

0

Sie können den Aggregatvorgang immer verhindern, indem Sie sicherstellen, dass die Zeilen eindeutig sind. Obwohl eine Aggregation {SUM | MIN | MAX} immer noch in der Syntax vorhanden sein muss, können die Zeilen, wenn sie eindeutig sind, niemals tatsächlich mehrere Zeilen haben, um darauf zu reagieren.

Eine größere Frage ist, was Sie wollen, wenn mehrere Zeilen vorhanden sind. Im folgenden Fall habe ich 1 Quellzeile dupliziert und Sie werden sehen, wie es aussieht, indem Sie den Code ausführen. Wenn Sie zusätzliche Zeilen ignorieren möchten, können Sie einfach "where r = 1" hinzufügen.

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

Sie wollten den Code "Frau Piet" und "Herr Name" nicht behalten? :) –