2012-03-08 51 views
4

我正在寫一份報告,需要顯示一週的收據,按地點分組,併爲每週的每一天分列。這將通過SSRS和SQL Server 2008 R2提供。最終的結果應該是這樣的:(但所有7個星期幾)TSQL報告 - 星期幾的數據透視數據?

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 

回答

6

可能做到這一點的最簡單方法是PIVOTDATENAME

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 query

工作的另一種方法是使用幾個自聯接,但不能做子查詢。這裏的關鍵是加入條款

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

好吧,這支點看起來真棒。現在嘗試。 – bluehiro 2012-03-08 19:17:59

+0

好的,我嘗試了兩種方法,他們都很好地工作。但是這個關鍵點很容易實現!非常感謝你,這正是我所期待的。我需要寫一堆這些,所以我會用Pivot寫所有這些。 – bluehiro 2012-03-08 19:52:20

+0

最後的評論,我只是重複使用它在15分鐘內推出類似的報告。嘿,是的! – bluehiro 2012-03-08 20:08:28

0

這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 
+0

你不需要*聚合結果......在數據透視後*這是SUM(成本)的作用 – 2012-03-08 19:34:08

+0

是的,我的不好,你是對的。我正在考慮提及按地點分組的問題,甚至沒有考慮到已經按照設定的方式進行分組。從我的答案中刪除誤導性信息。 – Clark 2012-03-08 19:46:44

+0

對於我的許多疑問,這是一個很好的觀點。做一次計算,而不是一遍又一遍。 – bluehiro 2012-03-08 19:48:21

相關問題