SQL Server: Beispiele für PIVOTing-String-Daten

124

Es wird versucht, einige einfache SQL Server PIVOT-Beispiele zu finden. Die meisten Beispiele, die ich gefunden habe, beinhalten das Zählen oder Summieren von Zahlen. Ich möchte nur einige Zeichenfolgendaten schwenken. Zum Beispiel habe ich eine Abfrage, die Folgendes zurückgibt.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Ich möchte PIVOT (wenn überhaupt möglich) verwenden, um die Ergebnisse wie folgt zu erzielen:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Ist das mit der PIVOT-Funktionalität überhaupt möglich?

Tim Cochran
quelle
Werfen Sie einen Blick auf diesen Link: dotnetgalactics.wordpress.com/2009/10/23/… Könnte hilfreich sein;)
Pato
Sie können diesen Link sehen, wenn die Anzahl der unterschiedlichen Elemente unbekannt ist. Dies bedeutet, dass die Anzahl der Spalten nach dem Schwenken dynamisch ist. SQL Server Pivot: Konvertieren von Zeilen in Spalten mit dynamischer Abfrage
maeenul

Antworten:

164

Denken Sie daran, dass die MAX-Aggregatfunktion sowohl für Text als auch für Zahlen funktioniert. Für diese Abfrage muss die Tabelle nur einmal gescannt werden.

SELECT Action,
       MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol, 
       MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
 FROM t
 GROUP BY Action
John Hubert
quelle
+1 Alter ... du bist ernsthaft ein Genie. Ich wünschte, ich hätte das früher wissen können, anstatt PIVOT lernen zu müssen!
Asche999
@ Silmaril89 nehmen an, dass der fragliche Name der zweiten Spalte "Daten" und die erste Spalte "Aktion" ist
Iman
1
Gibt es einen Grund, warum ich nicht ...ELSE NULL END...anstelle von verwenden sollte ...ELSE '' END...?
mo.
15
Was ist schneller, dies oder PIVOT?
Robert Jeppesen
Whoah, du hast mich einfach umgehauen. Im Hinterkopf hatte ich die Idee, was ich denke, dass SQL Server "nur verdammt noch mal machen sollte!", Dachte aber, dass es nicht möglich ist. Dann habe ich das gesehen.
David Hay
54

Tabellenaufbau:

CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL,
    view_edit VARCHAR(20) NOT NULL
);

INSERT INTO dbo.tbl (action, view_edit)
VALUES ('Action1', 'VIEW'),
       ('Action1', 'EDIT'),
       ('Action2', 'VIEW'),
       ('Action3', 'VIEW'),
       ('Action3', 'EDIT');

Dein Tisch: SELECT action, view_edit FROM dbo.tbl

Dein Tisch

Abfrage ohne PIVOT:

SELECT Action, 
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
FROM tbl t
GROUP BY Action

Abfrage mit PIVOT:

SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1 
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2

Beide Abfragen ergeben:
Geben Sie hier die Bildbeschreibung ein

mxasim
quelle
Vielen Dank für diese seltene, klare Antwort. es zeigt sofort ein Beispiel und die resultierenden Datensätze
real_yggdrasil
Ich weiß, dass dies alt ist, aber dies ist die klarste und am besten illustrierte Pivot-Demonstration, die ich je gesehen habe.
Stan Shaw
52

Wenn Sie speziell die SQL Server PIVOT-Funktion verwenden möchten, sollte dies funktionieren, vorausgesetzt, Ihre beiden ursprünglichen Spalten heißen act und cmd. (Nicht so schön anzusehen.)

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt
Meilen D.
quelle
6

Nun, für Ihre Stichprobe und jede mit einer begrenzten Anzahl eindeutiger Spalten sollte dies der Fall sein.

select 
    distinct a,
    (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
    (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
from t t1
vzczc
quelle
5
With pivot_data as
(
select 
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from   pivot_data
pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;
Vishwanath Dalvi
quelle
0

Ich hatte eine Situation, in der ich Zeichenfolgen analysierte und die ersten beiden Positionen der betreffenden Zeichenfolge die Feldnamen eines Kodierungsstandards für Ansprüche im Gesundheitswesen waren. Also würde ich die Strings entfernen und Werte für F4, UR und UQ oder so weiter erhalten. Dies war großartig für einen Datensatz oder einige Datensätze für einen Benutzer. Aber als ich Hunderte von Datensätzen und die Werte für alle Benutzer sehen wollte, musste es ein PIVOT sein. Dies war besonders für den Export vieler Schallplatten wunderbar, um hervorragende Leistungen zu erbringen. Die spezifische Berichtsanfrage, die ich erhalten hatte, lautete: "Jedes Mal, wenn jemand einen Anspruch für Benadryl eingereicht hat, welchen Wert hat er in den Feldern F4, UR und UQ eingereicht. Ich hatte eine AUSSENANWENDUNG, die den ColTitle und die Wertfelder unten erstellt hat."

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
1994Nerd
quelle