Sql server Sql联接和透视以获取类别总数

Sql server Sql联接和透视以获取类别总数,sql-server,tsql,Sql Server,Tsql,我有这些桌子 主表 [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 S

我有这些桌子

主表

[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
状态查找

[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来实现这一点,但我不明白如何使用连接和仅获取最后一个状态历史值来实现这一点。

我想这就是您所追求的。我重新创建了你的数据并对其进行了测试,但我肯定必须对所涉及的关系做出一两个假设。试试看,让我知道:

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\u key
,并分别调用了
main
category\u lookup
status\u lookup
status\u history

您所说的“上次[状态历史记录]值”是什么意思?就像每个
[key]
的最新状态历史记录一样?@PatJones是的,每个[key]的最新状态历史记录。哇,太紧张了!我设法把它翻译成了“真实世界”,它看起来不错。我在tB内部联接的SELECT语句中添加了WHERE子句(基本上是main上的WHERE子句)。它看起来像是正确的地点。谢谢你的帮助。希望将来我能用它来编写更好的SQL语句。不客气。通常有很多方法可以解决这些问题,但是由于您有四个表,并且正在进行一些聚合和最大值查找,因此自然会涉及很多连接。如果它对您有效,请随时将此标记为答案,谢谢!回复:将此标记为答案-算出并标记它。:)