如何解决SQL 帮助显示没有一年中每个月所有分行的开业次数
您好,我需要生成一份 SSRS 报告,以显示每个分支机构在一个日历年内每个月开设了多少个中心。报告将有 13 列,第一列是每行中的所有分支,其余 12 列将以一年中的几个月作为标题。我试图得到每个分支都没有的结果。每月开放的数量,因此我可以提供 SSRS 以表格格式显示。如果某个分行在任何月份没有任何职位空缺,我需要显示 0。
Branch table
=============
Branchid
Branchname
CenterOpen table
================
CenterOpenID
BranchID
CenterOpenDate
下面是我写的sql
WITH months(MonthNumber) AS (
SELECT
1
UNION ALL
SELECT
MonthNumber + 1
FROM
months
WHERE
MonthNumber < 12
),cteBranch(BranchID,BranchName,TargetopenDate,Month,Count) as (
SELECT
B.BranchID,B.BranchName,CS.TargetopenDate,MONTH(CS.TargetopenDate) as Month,count(Month(CS.TargetopenDate)) as Count
FROM
Branch B
left join goal.CenterOpenSchedule CS ON CS.BranchID = B.BranchID
GROUP BY
B.BranchID,MONTH(CS.TargetopenDate)
)
select
*
from
months
cross join cteBranch
order by
BranchID asc,MonthNumber asc
如果我使用交叉连接,每个分支都会重复几个月,如何解决这个问题?非常感谢您的帮助。
解决方法
不确定您使用的是哪个数据库。 有不同的方法可以从日期中提取月/年。 根据您的示例 SQL,我将使用 MONTH()
select branchName,count(case when month(centerOpenDate) = 1 then branchId end) Jan_Count
...
...
count(case when month(centerOpenDate) = 12 then branchId end) Dec_Count
from Branch b
join CenterOpen co
on (b.BranchId = co.BranchId)
where year(centerOpenDate) = <your year filter>
group by branchName
这将满足您的以下要求:
“第一列是每行中的所有分支,其余 12 列将以一年中的几个月作为标题。”
还有 -
“如果某个分行在任何月份都没有空缺职位,我需要显示 0。”
,您的问题不明确,但您似乎想要一年——因此您需要对年份进行过滤。
剩下的基本上是条件聚合:
select b.branchName,sum(case when month(co.centerOpenDate) = 1 then 1 else 0 end) as jan,sum(case when month(co.centerOpenDate) = 2 then 1 else 0 end) as feb,. . .
sum(case when month(co.centerOpenDate) = 12 then 1 else 0 end) as dec
from Branch b join
CenterOpen co
on b.BranchId = co.BranchId
where year(co.centerOpenDate) = @year
group by b.branchName
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。