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?



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

+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


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


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

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;

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])
 )
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.