SQL 帮助显示编号。一年中每个月所有分支机构的空缺职位

SQL help to display no. of openings for all branches for each month of a year

您好,我需要生成一份 SSRS 报告,以显示每个分支机构在一个日历年中每个月开设了多少个中心。报告将有 13 列,第一列是每行中的所有分支,其余 12 列将有一年中的月份 header。我试图得到每个分支没有的结果。每个月的职位空缺数量,因此我可以将 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,
    B.BranchName,
    CS.TargetOpenDate,
    MONTH(CS.TargetOpenDate)
)
select
  *
from
  months
  cross join cteBranch
order by
  BranchID asc,
  MonthNumber asc

如果我使用 cross join,每个分支都重复月份,如何解决这个问题?非常感谢您的帮助。

不确定您使用的是哪个数据库。 有多种方法可以从日期中提取 month/year。 根据您的示例 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 列将有一年中的月份 header。"

还有-

“如果某个分行在任何月份都没有空缺职位,我需要显示 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