SQL Server: esempi di dati di stringa PIVOT


125

Cercando di trovare alcuni semplici esempi di SQL Server PIVOT. La maggior parte degli esempi che ho trovato riguardano il conteggio o la somma dei numeri. Voglio solo ruotare alcuni dati di stringa. Ad esempio, ho una query che restituisce quanto segue.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Vorrei usare PIVOT (se anche possibile) per ottenere i risultati in questo modo:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

È possibile anche con la funzionalità PIVOT?



Dai un'occhiata a questo link: dotnetgalactics.wordpress.com/2009/10/23/… Potrebbe essere utile;)
Pato

Puoi vedere questo collegamento se il numero di elementi distinti è sconosciuto, il che significa che il numero di colonne dopo il pivot è dinamico. Pivot di SQL Server: conversione di righe in colonne con query dinamica
maggio

Risposte:


165

Ricorda che la funzione di aggregazione MAX funzionerà sia sul testo che sui numeri. Questa query richiederà solo la scansione della tabella una volta.

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 Amico ... sei davvero un genio. Avrei voluto saperlo prima, invece di dover imparare a fare il PIVOT!
ceneri,

@ Silmaril89 presume che il nome della seconda colonna in questione sia "dati" e la prima colonna sia "Azione"
Iman

1
C'è qualche motivo per cui non dovrei usare al ...ELSE NULL END...posto di ...ELSE '' END...?
mo.

15
Quale è più veloce, questo o PIVOT?
Robert Jeppesen

Whoah, mi hai appena fatto impazzire. Nella parte posteriore della mia testa avevo questa idea di quello che pensavo che il server SQL "dovrebbe semplicemente fare dannazione!", Ma ho pensato che non poteva essere fatto. Poi ho visto questo.
David Hay

54

Configurazione della tabella:

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

La tua tavola: SELECT action, view_edit FROM dbo.tbl

Il tuo tavolo

Query senza utilizzare 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

Query utilizzando 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

Risultato di entrambe le query:
inserisci qui la descrizione dell'immagine


Grazie per questa rara e chiara risposta. mostra immediatamente un esempio e i set di dati risultanti
real_yggdrasil

So che questo è vecchio, ma questa è la dimostrazione pivot più chiara e meglio illustrata che abbia mai visto.
Stan Shaw

52

Se si desidera utilizzare specificamente la funzione PIVOT di SQL Server, dovrebbe funzionare, supponendo che le due colonne originali siano chiamate act e cmd. (Non così carino da guardare però.)

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

Bene, per il tuo campione e tutti quelli con un numero limitato di colonne uniche, questo dovrebbe farlo.

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

Ho avuto una situazione in cui stavo analizzando le stringhe e le prime due posizioni della stringa in questione sarebbero i nomi dei campi di uno standard di codifica delle richieste di risarcimento. Quindi toglierei le stringhe e otterrei valori per F4, UR e UQ o altro. Questo è stato fantastico per un record o pochi record per un utente. Ma quando volevo vedere centinaia di record e i valori per tutti gli utenti, doveva essere un PIVOT. Questo è stato meraviglioso soprattutto per esportare molti record per eccellere. La specifica richiesta di segnalazione che avevo ricevuto era "ogni volta che qualcuno ha presentato un reclamo per Benadryl, quale valore ha inviato nei campi F4, UR e UQ. Avevo una APPLICAZIONE ESTERNA che creava il ColTitle e i campi dei valori sottostanti

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.