2012-09-21 57 views
3

我正在使用SSRS,我試圖填充報告以顯示按類別分組的月度計數。該報告應具有以列標題形式列出的類別,並將所有月份顯示爲列標題。要求是我需要顯示所有月份和類別,無論數據是否在這些列/行中。我如何編寫SQL查詢以包括所有月份和類別即使沒有記錄存在的所有類別的月度計數

我的問題是構建SQL查詢來做到這一點。

這裏是我的工作表的例子:

交易表:

create table [Transaction] (
    ContactID int Primary Key 
    , CategoryID int 
    , DateKey int 
) 

日曆表:

請注意,此表是作爲一個日期維度的設立初衷是爲與SSAS一起使用,但我決定不使用SSAS,因爲立方體開發對我來說已經不堪重負。本表中還有許多其他領域,但這些是關於這個問題的重要領域。

create table [Calendar] (
    DateID int Primary Key 
    , Date datetime 
    , Year nchar(4) 
    , Month nvarchar(2) 
) 

分類表:

create table [Category] (
    CategoryID int Primary Key 
    , CategoryName nvarchar 
) 

查詢需要返回在SSRS中使用的數據集來填充類似於以下報告:

Category | Jan | Feb | Mar | Apr | May | June | etc... 
-------------------------------------------------------------------- 
Category A | - | - | - | - | - | - | etc... 
-------------------------------------------------------------------- 
Category B | - | - | - | - | - | - | etc... 
-------------------------------------------------------------------- 
Category C | - | - | - | - | - | - | etc... 

我知道,它涉及OUTER JOINS,GROUP BY和子查詢的一些組合。我無法圍繞如何實現這一目標。

如果有人能夠幫助我解決這個問題,我會非常高興。

感謝

回答

2

下面的查詢獲取交易中的所有類別。它是在本月推出的,從日期中提取月份並計算交易次數。這將返回一行所有類別的數據

select c.categoryName, 
     sum(case when extract(month from date) = 1 then 1 else 0 end) as Jan, 
     sum(case when extract(month from date) = 2 then 1 else 0 end) as Feb, 
     sum(case when extract(month from date) = 3 then 1 else 0 end) as Mar, 
     . . . 
from transaction t join 
    category c 
    on t.categoryID = c.categoryID 
group by categoryName 
order by categoryName 

如果你確實需要所有類別,即使沒有交易可言,然後用右外連接:

select c.categoryName, 
     sum(case when extract(month from date) = 1 then 1 else 0 end) as Jan, 
     sum(case when extract(month from date) = 2 then 1 else 0 end) as Feb, 
     sum(case when extract(month from date) = 3 then 1 else 0 end) as Mar, 
     . . . 
from transaction t right outer join 
    category c 
    on t.categoryID = c.categoryID 
group by categoryName 
order by categoryName 
+0

感謝您的出色答覆!你的我的英雄!雖然我確實看到了爲什麼SSAS和MDX使這些查詢變得更容易,但學習曲線非常陡峭,但我能夠得到這個工作。只是要注意我無法使用「提取」功能。我用Month(日期)代替。我相信提取是MySql代碼?無論如何,它的工作,非常感謝。我也將成爲一名SQL Guru。 –

0

您可以使用PIVOT功能:

WITH Data AS 
( SELECT CategoryName, 
      Calendar.[Month], 
      ContactID 
    FROM Category 
      LEFT JOIN [Transaction] 
       ON [Transaction].CategoryID = Category.CategoryID 
      LEFT JOIN Calendar 
       AND [Transaction].DateKey = Calendar.DateID 
) 
SELECT CategoryName, 
     [1] AS [Jan], 
     [2] AS [Feb], 
     [3] AS [Mar], 
     [4] AS [Apr], 
     [5] AS [May], 
     [6] AS [Jun], 
     [7] AS [Jul], 
     [8] AS [Aug], 
     [9] AS [Sep], 
     [10] AS [Oct], 
     [11] AS [Nov], 
     [12] AS [Dec] 
FROM Data 
     PIVOT 
     ( COUNT(ContactID) 
      FOR [Month] IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) 
     ) pvt 
相關問題