sql >> Base de Datos >  >> RDS >> Sqlserver

Quiero un resultado de consulta seleccionado en formato tabular como informe resumido

En SQL Server 2008, puede manejar esta tarea con bastante facilidad con una consulta PIVOT. El siguiente ejemplo se basa en obtener sus datos en el siguiente formato (que parece que ya lo ha hecho):

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

Si puede hacer eso, entonces su consulta PIVOT debería verse así:

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]

En este ejemplo, utilicé SUM([Value]) OVER PARTITION para obtener las sumas de cada Distrito, y luego hice una UNIÓN para agregar una fila de totales al final. Los resultados se ven así:

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

Una cosa que notará sobre este enfoque es que debe saber los nombres de las columnas que desea en la parte superior de la tabla con anticipación. Eso es fácil de hacer si está configurando el informe para que se ejecute durante un año completo, pero es más complicado si la cantidad de columnas va a cambiar. Si va a permitir que los usuarios especifiquen un rango de fechas personalizado (es decir, 07/2011-10/2011 o 06/2011-11/2011), entonces una forma de manejar ese requisito es construir la consulta PIVOT usando SQL dinámico y luego ejecútelo con sp_executesql .