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
您好,我需要生成一份 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