Я хочу выбрать результат запроса в табличном формате, например, сводный отчет - PullRequest
3 голосов
/ 30 ноября 2011

для примера

           month1  month2 month3  total
district1    5       2      9       16
district2    1       0      11      12
    .
    .

 total        260    150     140    550

здесь итоговая сумма не так уж важна.но, по крайней мере, мне нужно показывать счет за район в месяц.

SELECT Districts_mst.district_name,COUNT(Payments.PaymentId)users ,DATEPART(M,payments.saveon)Month
FROM Payments
JOIN Subsciber ON Payments.SubId =Subsciber.SubId
JOIN districts_mst ON districts_mst.district_id = Subsciber.District
where lang_id=1
group by district_name, DATEPART(M,payments.saveon)

, которые дают мне список, как .....

district_name   users   Month 
dist0           1       1 
dist1           1       11 
dist2           3       11 
dist3           1       11 
dist4           3       11 
dist5           1       12 
dist6           1       12

1 Ответ

3 голосов
/ 30 ноября 2011

В 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...