3

私は SSRS を使用しており、カテゴリ別にグループ化された月次カウントを表示するレポートを作成しようとしています。レポートには、カテゴリが行ヘッダーとしてリストされ、その年のすべての月が列ヘッダーとして表示されます。要件は、それらの列/行に含まれるデータがあるかどうかに関係なく、すべての月とカテゴリを表示する必要があるということです。

私の問題は、まさにそれを行うための 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、およびサブクエリの組み合わせが含まれていることはわかっています。これを達成する方法について頭を悩ませることはできません。

誰かがこの問題で私を助けてくれたらとてもうれしいです.

ありがとう

4

2 に答える 2

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
于 2012-09-21T18:26:34.773 に答える
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
于 2012-09-21T19:27:56.437 に答える