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

Chcę otrzymać wynik zapytania wybierającego w formacie tabelarycznym, takim jak raport podsumowujący

W SQL Server 2008 możesz łatwo poradzić sobie z tym zadaniem za pomocą zapytania PIVOT. Poniższy przykład polega na pobraniu danych w następującym formacie (co wygląda na to, że już to zrobiłeś):

Name        Month    Value
----------  -------  -----
District 1  Month 1     10
District 1  Month 2      5
District 1  Month 3      6
District 2  Month 1      1
District 2  Month 2      2
District 2  Month 3      3
District 3  Month 1      8
District 3  Month 2      6
District 3  Month 3     11

Jeśli możesz to zrobić, twoje zapytanie PIVOT powinno wyglądać mniej więcej tak:

DECLARE @myTable AS TABLE([Name] VARCHAR(20), [Month] VARCHAR(20), [Value] INT)
INSERT INTO @myTable VALUES ('District 1', 'Month 1', 10)
INSERT INTO @myTable VALUES ('District 1', 'Month 2', 5)
INSERT INTO @myTable VALUES ('District 1', 'Month 3', 6)
INSERT INTO @myTable VALUES ('District 2', 'Month 1', 1)
INSERT INTO @myTable VALUES ('District 2', 'Month 2', 2)
INSERT INTO @myTable VALUES ('District 2', 'Month 3', 3)
INSERT INTO @myTable VALUES ('District 3', 'Month 1', 8)
INSERT INTO @myTable VALUES ('District 3', 'Month 2', 6)
INSERT INTO @myTable VALUES ('District 3', 'Month 3', 11)

SELECT [Name], [Month 1], [Month 2], [Month 3], [NameTotalValue] AS [Total]
FROM
(
      SELECT [Name], [Month], [Value], 
             SUM([Value]) OVER (PARTITION BY [Name]) as [NameTotalValue] 
      FROM @myTable
    UNION 
      SELECT 'Total', [Month], SUM([Value]), (SELECT SUM([Value]) FROM @myTable)
      FROM @myTable
      GROUP BY [Month]
) t
PIVOT
(
    SUM([Value]) FOR [Month] IN ([Month 1], [Month 2], [Month 3]) 
) AS pvt
ORDER BY pvt.[Name]

W tym przykładzie użyłem SUM([Value]) OVER PARTITION aby uzyskać sumy dla każdego dystryktu, a następnie zrobiłem UNION, aby dodać wiersz sum na dole. Wyniki wyglądają tak:

Name        Month 1 Month 2 Month 3 Total
----------- ------- ------- ------- -----
District 1       10       5       6    21
District 2        1       2       3     6
District 3        8       6      11    25
Total            19      13      20    52

Jedną z rzeczy, które zauważysz w tym podejściu, jest to, że musisz znać nazwy kolumn, które chcesz umieścić na górze tabeli. Jest to łatwe, jeśli konfigurujesz raport tak, aby był generowany przez cały rok, ale jest trudniejsze, jeśli zmieni się liczba kolumn. Jeśli zamierzasz zezwolić użytkownikom na określenie niestandardowego zakresu dat (np. 07/2011-10/2011 lub 06/2011-11/2011), to jednym ze sposobów obsłużenia tego wymagania jest zbudowanie zapytania PIVOT przy użyciu dynamicznego SQL a następnie uruchom go za pomocą sp_executesql .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - Transakcje zagnieżdżone w procedurze składowanej

  2. Zapętlenie w wyzwalaczu?

  3. Jak dodać kolumnę tożsamości do tabeli za pomocą TSQL i GUI w SQL Server - SQL Server / T-SQL Tutorial, część 40

  4. Jak ograniczyć użytkownikowi dostęp do obiektów tylko jednego schematu w SQL Server 2008?

  5. SQL Server zużywa dużo procesora podczas wyszukiwania wewnątrz ciągów nvarchar