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语句。不客气。通常有很多方法可以解决这些问题,但是由于您有四个表,并且正在进行一些聚合和最大值查找,因此自然会涉及很多连接。如果它对您有效,请随时将此标记为答案,谢谢!回复:将此标记为答案-算出并标记它。:)