Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query di SQL Server:le righe creano colonne (Pivot?)

Il pivot è molto simile al raggruppamento. Potresti vederlo come un raggruppamento limitato con un "effetto speciale". La limitazione consiste nel fatto che può esistere una sola colonna aggregata. (Nella normale query GROUP BY puoi averne più di una, naturalmente.) E per "effetto speciale" intendo, ovviamente, che una delle altre colonne (e, ancora, solo una) viene trasformata in più colonne.

Prendiamo come esempio la tua query GROUP BY. Hai tre colonne nell'output. Uno di questi, Count , è la colonna stessa che contiene informazioni aggregate. Questo è quello che sarebbe sparso tra più colonne in una query PIVOT. Un'altra colonna, Priority , è una delle altre due colonne in cui sono raggruppati i risultati e anche quella che deve essere ruotata. Infine, EntryDate è l'altra colonna GROUP BY. Dovrebbe semplicemente rimanere così com'è, perché non partecipa direttamente alla rotazione.

Vediamo ora come la tua SELECT principale viene trasformata da una normale query GROUP BY in una query PIVOT, passo dopo passo:

  1. Poiché il raggruppamento è implicito in una query PIVOT, la clausola GROUP BY viene rimossa. Viene invece introdotta una clausola PIVOT.

  2. Il Count l'espressione della colonna viene spostata dalla clausola SELECT alla clausola PIVOT.

  3. La suddivisione della Priority colonna è definita nella clausola PIVOT.

  4. La Priority e Count le colonne nella clausola SELECT sono sostituite dall'elenco delle colonne definite nella clausola PIVOT.

  5. Il EntryDate la colonna rimane invariata nella clausola SELECT.

Ed ecco la query risultante, con commenti che contrassegnano ogni parte della trasformazione sopra descritta:

WITH TATH(Priority, EntryDate) AS 
(
    SELECT TH.Priority as Priority, DATEADD(dd, 0, DATEDIFF(dd, 0, entryDate)) as EntryDate
      FROM TicketAssignment TA, TicketHeader TH 
     WHERE TA.TicketID = TH.TicketID   
       AND TA.Company = 'IT'
       AND TA.CurrentRole IN ('SA1B','SA1C','SDA')
) 
SELECT
  convert(varchar(10), EntryDate,103) as EntryDate,                       -- #5
  [0] AS Priority0, [1] AS Priority1, [2] AS Priority2, [3] AS Priority3  -- #4
FROM TATH
PIVOT (                                                                   -- #1
  COUNT(*)                                                                -- #2
  FOR Priority IN ([0], [1], [2], [3])                                    -- #3
) p

/*  -- your original main query, for comparison
SELECT
  Priority,                                                               -- #4
  convert(varchar(10),                                                    -- #5
  EntryDate,103) as EntryDate, COUNT(*) AS Count                          -- ##2&4
FROM TATH 
GROUP BY Priority, EntryDate                                              -- #1
*/

C'è una nota aggiuntiva nell'elenco delle colonne nella clausola PIVOT. Prima di tutto, devi capire che l'insieme risultante di una query SQL dovrebbe essere corretto in termini di numero di colonne e dei loro nomi. Ciò significa che devi enumerare in modo esplicito tutte le colonne trasformate che desideri visualizzare nell'output. I nomi derivano dai valori della colonna sottoposta a pivot, ma devono essere specificati come nomi , non come valori. Ecco perché puoi vedere parentesi quadre attorno ai numeri elencati. Poiché i numeri stessi non soddisfano le regole per identificatori regolari , devono essere delimitati.

Puoi anche vedere che puoi alias colonne pivot nella clausola SELECT come qualsiasi altra colonna o espressione. Quindi, alla fine, non devi ritrovarti con l'insensato 0 , 1 ecc. identificatori e invece puoi assegnare a quelle colonne i nomi che preferisci.

Se vuoi che il numero e/o i nomi delle colonne pivot siano dinamici, dovrai creare la query in modo dinamico, ovvero raccogliere prima i nomi, quindi incorporarli in una stringa contenente il resto delle interrogare e richiamare la query finale con EXEC () o EXEC sp_executesql . Puoi cercare in questo sito per ulteriori informazioni sul pivoting dinamico.