Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL Server:wiersze tworzą kolumny (przestawne?)

Obracanie przypomina grupowanie. Można to postrzegać jako ograniczone grupowanie z „efektem specjalnym”. Ograniczenie polega na tym, że zagregowana może być tylko jedna kolumna. (W normalnym zapytaniu GROUP BY można oczywiście mieć więcej niż jedną.) A przez „efekt specjalny” mam na myśli oczywiście, że jedna z pozostałych kolumn (i znowu tylko jedna) zostaje przekształcona w wiele kolumn.

Weźmy jako przykład zapytanie GROUP BY. W wyniku masz trzy kolumny. Jeden z nich, Count , to ta sama kolumna, która zawiera zagregowane informacje. To jest ten, który byłby rozproszony w wielu kolumnach w zapytaniu PIVOT. Kolejna kolumna, Priority , to jedna z dwóch pozostałych kolumn, według których są pogrupowane wyniki, a także ta, którą należy przestawić. Na koniec EntryDate to druga kolumna GROUP BY. Powinna po prostu pozostać taka, jaka jest, ponieważ nie bierze bezpośrednio udziału w obracaniu.

Zobaczmy teraz, jak Twój główny SELECT zostanie przekształcony ze zwykłego zapytania GROUP BY w zapytanie PIVOT, krok po kroku:

  1. Ponieważ grupowanie jest implikowane w zapytaniu PIVOT, klauzula GROUP BY jest usuwana. Zamiast tego wprowadzono klauzulę PIVOT.

  2. Count wyrażenie kolumny jest przenoszone z klauzuli SELECT do klauzuli PIVOT.

  3. Podział Priority kolumna jest zdefiniowana w klauzuli PIVOT.

  4. Priority i Count kolumny w klauzuli SELECT są zastępowane listą kolumn zdefiniowanych w klauzuli PIVOT.

  5. EntryDate kolumna pozostaje niezmieniona w klauzuli SELECT.

A oto wynikowe zapytanie z komentarzami oznaczającymi każdą część opisanej powyżej transformacji:

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
*/

Na liście kolumn w klauzuli PIVOT jest jeszcze jedna uwaga. Przede wszystkim musisz zrozumieć, że wynikowy zestaw zapytania SQL ma być ustalony pod względem liczby kolumn i ich nazw. Oznacza to, że musisz jawnie wyliczyć wszystkie przekształcone kolumny, które chcesz zobaczyć w wyniku. Nazwy pochodzą z wartości przestawianej kolumny, ale powinny być określone jako nazwy , a nie jako wartości. Dlatego wokół wymienionych liczb można zobaczyć nawiasy kwadratowe. Ponieważ same liczby nie spełniają zasad dla zwykłych identyfikatorów , muszą być oddzielone.

Możesz również zobaczyć, że możesz aliasować kolumny przestawne w klauzuli SELECT, tak jak każdą inną kolumnę lub wyrażenie. Więc w końcu nie musisz skończyć z bezsensownym 0 , 1 itp. identyfikatorów i zamiast tego możesz przypisać tym kolumnom dowolne nazwy.

Jeśli chcesz, aby liczba i/lub nazwy przestawianych kolumn były dynamiczne, musisz zbudować zapytanie dynamicznie, tj. najpierw zebrać nazwy, a następnie włączyć je do ciągu zawierającego resztę zapytanie i wywołaj ostatnie zapytanie za pomocą EXEC () lub EXEC sp_executesql . Możesz przeszukać tę witrynę aby uzyskać więcej informacji na temat dynamicznego obracania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Automatyczna korekta planu w SQL Server

  2. Jak wstawić dane do tabeli SQL Server za pomocą R?

  3. Zmień nazwę typu danych zdefiniowanego przez użytkownika w programie SQL Server (T-SQL)

  4. Używanie danych wyjściowych do ustawiania zmiennej w instrukcji scalania

  5. Sprawdź, czy ciąg zawiera znaki akcentowane w SQL?