Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Искам резултат от заявка за избор в табличен формат като обобщен отчет

В SQL Server 2008 можете да се справите с тази задача доста лесно с PIVOT заявка. Следващият пример разчита на получаване на вашите данни в следния формат (което изглежда, че вече сте направили):

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

Ако можете да направите това, тогава вашата PIVOT заявка трябва да изглежда по следния начин:

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]

В този пример използвах SUM([Value]) OVER PARTITION за да получа сумите за всеки район и след това направих UNION, за да добавя ред с общи суми в дъното. Резултатите изглеждат така:

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

Едно нещо, което ще забележите при този подход е, че трябва да знаете предварително имената на колоните, които искате в горната част на таблицата. Това е лесно да направите, ако настройвате отчета да се изпълнява за цяла година, но е по-трудно, ако броят на колоните ще се промени. Ако ще позволите на потребителите да посочват персонализиран диапазон от дати (т.е. 07/2011-10/2011 или 06/2011-11/2011), тогава един от начините да се справите с това изискване е да създадете PIVOT заявката с помощта на динамичен SQL и след това го изпълнете с 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. Функции на прозореца - Работно общо с нулиране

  2. Създаване на заглавка на колона Gridview чрез зареждане на данни от база данни

  3. Грешка при импортиране при използване на Openrowset

  4. Използване на вложено използване в C# и SQL Server

  5. Има ли StartsWith или Contains в t sql с променливи?