TSQL Reporting - сводные данные по дням недели? - PullRequest
4 голосов
/ 08 марта 2012

Я пишу отчет, который должен отображать сумму поступлений за неделю, сгруппированную по местоположениям, с отдельным столбцом для каждого дня недели. Это будет доставлено через SSRS и SQL Server 2008 R2. Конечный результат должен выглядеть так: (но за все 7 дней недели)

Location    Monday    Tuesday
Building3   $100      $75
Building4   $25       $35
Building5   $105      $21

Я написал следующую инструкцию T-SQL SELECT, чтобы получить эти данные из моей переменной таблицы отчетов (@reporting). С целью затем сгруппировать выходные данные по местоположению, чтобы получить макет, показанный выше.

В необработанных данных указывается дата получения, общая сумма и местоположение в одной строке. Я хочу повернуть данные так, чтобы день недели был на вершине. Должен быть лучший способ сделать это, чем вы видите ниже. Любая помощь?

    SELECT
        LocationKey.Location
        ,Sunday.Cost as Sunday
        ,Monday.Cost as Monday
    FROM 

        (
            SELECT DISTINCT Location 
            FROM @reporting
            WHERE Location NOT IN ('Building01', 'Building02', '')
        ) AS LocationKey

    LEFT JOIN  

(SELECT  

sunday.Location
,sunday.Cost

FROM @reporting as sunday (nolock) 

WHERE DATEPART(weekday,sunday.ReceiptDate)= 1

        ) AS Sunday
        ON Sunday.Location = LocationKey.Location

LEFT JOIN  

(SELECT  
Monday.Location,
Monday.Cost

FROM @reporting as Monday (nolock) 

WHERE DATEPART(weekday,Monday.ReceiptDate)= 2

        ) AS Monday
        ON Monday.Location = LocationKey.Location

Ответы [ 2 ]

6 голосов
/ 08 марта 2012

Вероятно, самый простой способ сделать это - PIVOT на DATENAME .

SELECT location, 
       [Saturday], 
       [Sunday], 
       [Monday], 
       [Tuesday], 
       [Wednesday], 
       [Thursday], 
       [Friday] 
FROM   (SELECT COST, 
               location, 
               Datename(weekday, receiptdate) DAY 
        FROM   @reporting 
        WHERE  location NOT IN ( 'Building01', 'Building02', '' )) p 
      PIVOT ( 
        SUM (COST) 
        FOR DAY IN ( [Saturday], [Sunday], [Monday], [Tuesday], [Wednesday], 
       [Thursday], [Friday]) ) pvt 

Посмотрите, как работает этот запрос data.se

Другой способ - использовать несколько самостоятельных соединений, но не выполнять подзапросы.Ключевым моментом здесь является предложение о присоединении

SELECT LocationKey.Location,
       SUM(Sunday.Cost) As [Sunday],
       SUM(Monday.Cost) As [Monday],
       SUM(Tuesday.Cost) As [Tuesday],
       SUM(Wednesday.Cost) As [Wednesday],
       SUM(Thursday.Cost) As [Thursday],
       SUM(Friday.Cost) As [Friday],
       SUM(Saturday.Cost) As [Saturday]
FROM
      (SELECT DISTINCT Location 
            FROM @reporting
            WHERE Location NOT IN ('Building01', 'Building02', '')) LocationKey
      LEFT JOIN @Reporting Sunday 
      ON LocationKey.Location = Sunday.Location
         AND DATEPART(weekday,sunday.ReceiptDate)= 1
      LEFT JOIN @Reporting Monday
      ON LocationKey.Location = Monday.Location
         AND DATEPART(weekday,Monday.ReceiptDate)= 2
      LEFT JOIN @Reporting Tuesday
      ON LocationKey.Location = Tuesday.Location
         AND DATEPART(weekday,Tuesday.ReceiptDate)= 3
      LEFT JOIN @Reporting Wednesday
      ON LocationKey.Location = Wednesday.Location
         AND DATEPART(weekday,Wednesday.ReceiptDate)= 4
      LEFT JOIN @Reporting Thursday
      ON LocationKey.Location = Thursday.Location
         AND DATEPART(weekday,Thursday.ReceiptDate)= 5
      LEFT JOIN @Reporting Friday
      ON LocationKey.Location = Friday.Location
         AND DATEPART(weekday,Friday.ReceiptDate)= 6         
      LEFT JOIN @Reporting Saturday
      ON LocationKey.Location = Saturday.Location
         AND DATEPART(weekday,Saturday.ReceiptDate)= 7

. Обратите внимание, что вам следует либо позвонить SET DATEFIRST, либо использовать смещение @@DATEFIRST, чтобы защитить свой запрос от потенциальныхнастройки по умолчанию меняются и нарушают ваш запрос при использовании DATEPART(weekday..

0 голосов
/ 08 марта 2012

Этот запрос PIVOT должен дать вам то, что вы хотите:

select Location, Cost_D1, Cost_D2, Cost_D3, Cost_D4, Cost_D5, Cost_D6, Cost_D7
from (
    select Location, 'Cost_D' + convert(varchar,datepart(weekday,ReceiptDate)) as FieldName, Cost
    from @reporting
) s
pivot
(
    sum(Cost)
    for FieldName
    in (Cost_D1, Cost_D2, Cost_D3, Cost_D4, Cost_D5, Cost_D6, Cost_D7)
) p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...