2017-12-01 4 views
2

私はこれらのテーブルがあります。SQL結合とピボットカテゴリの合計を取得する

メインテーブル

[key] [CategoryID] 
AAAA 100 
BBBB 100 
CCCC 101 
DDDD 102 
EEEE 201 
FFFF 202 
GGGG 202 
etc. 

カテゴリー検索

[CategoryID] [Category]  [Subcategory] 
100    Category1  Subcategory1 
101    Category1  Subcategory2 
102    Category1  Subcategory3 
103    Category1  Subcategory4 
200    Category2  SubcategoryA 
201    Category2  SubcategoryB 
202    Category2  SubcategoryC 
etc. 

ステータス検索

[StatusID] [Description] 
0   New 
500   Accepted 
501   Rejected 

のステータス履歴

[key] [StatusID]  [date] 
AAAA 0    2017-01-01 
BBBB 0    2017-01-01 
CCCC 0    2017-01-01 
DDDD 0    2017-01-01 
EEEE 0    2017-01-01 
FFFF 0    2017-01-01 
GGGG 0    2017-01-01 
AAAA 500    2017-01-02 
BBBB 501    2017-01-02 
EEEE 501    2017-01-02 
FFFF 500    2017-01-02 
BBBB 500    2017-01-03 
EEEE 500    2017-01-03 
etc. 

私は(アウト電子メールで送信されます)結果の毎月の要約を取得したいのですが。今私はコード内にサマリーテーブルを作成しています。私はSQLでそれを行う方法を学びたいですが、どこから始めるべきかはわかりません。

合計は最後の[Status History]値に基づいており、[Total] DESCで順序付けられています。

[Category] [Subcategory] [New] [Accepted] [Rejected] [Total] 
Category1 Subcategory1 13  8   2   23 
Category2 Subcategory3 10  4   6   20 
Category1 Subcategory2 5  8   4   17 

私はこれを行うにはPIVOTを見てみましたが、私は参加するだけで、最後のステータス履歴値を取得してでそれを行う方法を理解していません。

+1

「[ステータス履歴]の最後の値」はどういう意味ですか?各[key]の最新のステータス履歴と同様に? –

+0

@PatJonesはい、各[キー]の最新のステータス履歴です。 – bizzo

答えて

0

私はこれがあなたの後であると思います。私はあなたのデータを再現し、それをテストしましたが、間違いなく関連する関係について1つまたは2つの前提を作る必要がありました。それを試してみて、私に知らせてください:

select Category, 
     Subcategory, 
     sum(case when description = 'New' then 1 else 0 end) as New, 
     sum(case when description = 'Accepted' then 1 else 0 end) as Accepted, 
     sum(case when description = 'Rejected' then 1 else 0 end) as Rejected, 
     count(*) as Total 
from 
(select tB.Category, tB.Subcategory, status_lookup.Description 
from status_history inner join (select my_key, max(status_date) as lastdate 
           from status_history 
           group by my_key) tA on status_history.my_key = tA.my_key 
                 and status_history.status_date = tA.lastdate 
        inner join status_lookup on status_history.StatusID = status_lookup.StatusID 
        inner join (select main.my_key, category_lookup.Category, category_lookup.Subcategory 
           from main inner join category_lookup on main.CategoryID = category_lookup.CategoryID) tB on status_history.my_key = tB.my_key) tC 
group by Category, Subcategory 

私は、それぞれ自分の[key]my_key、およびmainテーブルと呼ばれる、category_lookupstatus_lookup、およびstatus_historyの名前を変更しました。

+0

うわー、それは激しい!私はそれを「現実の世界」に翻訳することができました。私はWHERE節をtBのINNER JOINの内側にあるSELECT文に追加しました(基本的にWHERE節はmainにあります)。それは正しい場所のように見えました。ご協力ありがとうございました。うまくいけば、これを使って将来的により良いSQL文を書くことができます。 – bizzo

+0

ようこそ。通常、これらのことを行うには多くの方法がありますが、4つのテーブルがあり、いくつかの集約と最大限の検索を行っているので、多くの結合が自然に行われます。それがあなたのために働く場合は、これを答えとしてマークしてください。ありがとう! –

+0

re:これを答えとしてマークし、それをマークしました。 :) – bizzo

関連する問題