Frage

Ich versuche, einige einfache SQL Server PIVOT-Beispiele zu finden.Bei den meisten Beispielen, die ich gefunden habe, geht es um das Zählen oder Summieren von Zahlen.Ich möchte nur einige String-Daten schwenken.Ich habe zum Beispiel eine Abfrage, die Folgendes zurückgibt.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Ich würde gerne PIVOT verwenden (wenn überhaupt möglich), um folgende Ergebnisse zu erzielen:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

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

War es hilfreich?

Lösung

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

Andere Tipps

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.(Allerdings 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

Tischaufbau:

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

Your table

Abfrage ohne Verwendung von 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:
enter image description here

Aus http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/:

SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT
( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
UNPIVOT
(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
) AS Unpvt
GO

Nun, für Ihre Stichprobe und alle mit einer begrenzten Anzahl eindeutiger Spalten sollte dies ausreichen.

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
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;

Ich hatte eine Situation, in der ich Zeichenfolgen analysierte und die ersten beiden Positionen der betreffenden Zeichenfolge die Feldnamen eines Kodierungsstandards für Gesundheitsansprüche waren.Also würde ich die Zeichenfolgen entfernen und Werte für F4, UR und UQ oder so weiter erhalten.Das war großartig für eine Platte oder einige Platten für einen Benutzer.Aber wenn ich Hunderte von Datensätzen und die Werte für alle Benutzer sehen wollte, musste es ein PIVOT sein.Das war wunderbar, insbesondere für den Export vieler Datensätze nach Excel.Die konkrete Meldeanfrage, die ich erhalten hatte, lautete: „Jedes Mal, wenn jemand einen Anspruch für Benadryl einreichte, welchen Wert hat er in den Feldern F4, UR und UQ angegeben?“Ich hatte ein OUTER APPLY, das den ColTitle und die Wertefelder unten erstellte

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

Sie können dies mit Pivotierung verwenden:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top