我已经创建了一个包含以下数据集的表
CREATE TABLE [dbo].[RiskTable]
(
[ReqID] [int] NOT NULL,
[ModuleName] [nvarchar](50) NULL,
[CreatedDate] [datetime2](7) NULL,
[AssociatedRisk] [nvarchar](50) NULL
)
Model | AssociatedRisk | Created Date |
---|---|---|
IDP | High | 2022-12-18 00:00:00.0000000 |
Saa | High | 2023-01-02 00:00:00.0000000 |
Saa | Medium | 2023-01-07 00:00:00.0000000 |
Saa | Critical | 2023-01-29 00:00:00.0000000 |
Saa | Low | 2023-02-05 00:00:00.0000000 |
Saa | Low | 2023-02-07 00:00:00.0000000 |
EEE | Critical | 2023-03-09 00:00:00.0000000 |
Info | Low | 2023-04-08 00:00:00.0000000 |
IDP | High | 2023-04-28 00:00:00.0000000 |
IDP | Medium | 2023-05-08 00:00:00.0000000 |
我有一个满足以下条件的存储过程:
- 如果我给模型=SAA,START_DATE=2023-01-01,END_DATE=2023-02-10,我想让它显示模型‘SAA’在特定月份(2023-01-01(1月)、2023-02-10(2月))的风险总数(低、中、高和严重).
- 如果我给出的模型=Null,Start_Date=2023-04-01,End_Date=2023-05-11,我希望它显示所有模型在这些特定月份(2023-04-01(4月)、2023-05-11(5月))的风险总数(低、中、高和严重). 我在之前的情况下得到的输出: |型号|月|风险|总数风险程度| -| 全部|4月或04|低|1 全部|4月或04月|中|0 全部|4月或04|高|1 全部|4月或04月|严重|0 全部|5月或05|低|0 全部|5月或05日|中|1 全部|5月或05|高|0 全部|5或05|严重|0
CREATE PROCEDURE Month_base_global
@model varchar(20),
@start_date date,
@end_date date
AS
BEGIN
IF @model = 'ALL'
BEGIN
SELECT 'ALL' as [Module], ac.[Month], ac.AssociatedRisk as Risk, count(ri.ModuleName) as 'Total risks'
FROM (
SELECT DISTINCT convert(varchar(7), r.CreatedDate, 126) as [month], a.AssociatedRisk, m.ModuleName
FROM RiskTable r
FULL OUTER JOIN (
SELECT DISTINCT AssociatedRisk
FROM RiskTable
) as a on a.AssociatedRisk is not null
FULL OUTER JOIN (
SELECT DISTINCT ModuleName
FROM RiskTable
) as m on m.ModuleName is not null
WHERE (r.CreatedDate) between (@start_date) and (@end_date)
) as ac
LEFT JOIN RiskTable ri on ac.[month] = convert(varchar(7), ri.CreatedDate, 126)
and ac.AssociatedRisk = ri.AssociatedRisk
and ac.ModuleName = ri.ModuleName
GROUP BY ac.[month], ac.AssociatedRisk
ORDER BY ac.[month], ac.AssociatedRisk desc
END
ELSE
BEGIN
SELECT @model as [Module], ac.[Month], ac.AssociatedRisk as Risk, count(ri.ModuleName) as 'Total risks'
FROM (
SELECT DISTINCT convert(varchar(7), r.CreatedDate, 126) as [month], a.AssociatedRisk, m.ModuleName
FROM RiskTable r
FULL OUTER JOIN (
SELECT DISTINCT AssociatedRisk
FROM RiskTable
) as a on a.AssociatedRisk is not null
FULL OUTER JOIN (
SELECT DISTINCT ModuleName
FROM RiskTable
) as m on m.ModuleName = @model
WHERE r.CreatedDate between DATEADD(mm, DATEDIFF(mm, 0, @start_date), 0) and eomonth(@end_date)
) as ac
LEFT JOIN RiskTable ri on ac.[month] = convert(varchar(7), ri.CreatedDate, 126)
and ac.AssociatedRisk = ri.AssociatedRisk
and ac.ModuleName = ri.ModuleName
GROUP BY ac.ModuleName, ac.[month], ac.AssociatedRisk
ORDER BY ac.[month], ac.AssociatedRisk desc
END
END
Exec Month_base_global 'ALL' , '2022-02-01', '2023-01-28'
现在我没有什么更多的条件了
Exec Month_base_global 'ALL' , null, '2023-01-28'
个
3.如果Model=All或任何特定型号,如‘SAA’或‘IDA’或任何东西,则Start_Date=NULL,End_Date=2023-01-28.它必须从头开始获取该特定型号或所有型号的表中的所有记录.
Exec Month_base_global 'ALL' , '2022-12-03', null
个
4.如果Model=All或任何特定模型,如‘SAA’或‘IDA’等,则START_DATE=2022-12-03,END_DATE=NULL表示它必须显示从该特定START_DATE到收款日期(最新)的记录.
Exec Month_base_global 'ALL' , null, null
个
5.如果Model=All或任何特定的Model,如‘SAA’或‘IDA’等,则START_DATE=NULL,END_DATE=NULL表示它必须显示从创建日期开始到截止日期(最新)的所有记录.
有没有人能帮我一下?谢谢