微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL 帮助显示没有一年中每个月所有分行的开业次数

如何解决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 举报,一经查实,本站将立刻删除。