我已经创建了一个包含以下数据集的表

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

我有一个满足以下条件的存储过程:

  1. 如果我给模型=SAA,START_DATE=2023-01-01,END_DATE=2023-02-10,我想让它显示模型‘SAA’在特定月份(2023-01-01(1月)、2023-02-10(2月))的风险总数(低、中、高和严重).
  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表示它必须显示从创建日期开始到截止日期(最新)的所有记录.

有没有人能帮我一下?谢谢

推荐答案

您可以通过将开始日期初始化为以前的日期来完成此操作,例如将开始日期初始化为'1970-01-01',将结束日期初始化为'2030-12-31':

CREATE PROCEDURE Month_base_global
                @model varchar(20),   
                @p_start_date date,
                @p_end_date date
AS
BEGIN
DECLARE @start_date date;
DECLARE @end_date date;
    SET @start_date = @p_start_date ;
    SET @end_date = @p_end_date ;
    IF (@p_start_date IS NULL)
    BEGIN
       SET @start_date = '1970-01-01';
    END

    IF (@p_end_date IS NULL)
    BEGIN
       SET @end_date = '2030-12-31';
    END

    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

Demo here

Sql相关问答推荐

识别顺序记录组

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

PostgreSQL抽奖查询

将Dense_RANK列为聚合(非解析)函数(&A)

SQL按日期分组字段和如果日期匹配则求和

需要从键-值对数据中提取值

在子窗口SQL Presto中使用特定条件执行值计数

在SQL中转换差异表的多列

删除行而不使数据库超载

POSTGRES to_timestamp() 假定 UTC 字符串为本地时间

PostgreSQL-用第一个非空填充以前的值

一次 Select 语句中按组累计的SQL累计数

批量更改WooCommerce中所有产品的税收状态

获取 SQL Server 中每一行的两个-之间的文本

如何更改 duckdb R 中的数据约束

如何通过存储过程将 root 的下一个子 node 作为父 node ?

snowfalke 会在 Select 运行时锁定表吗?

如何在 SQL Server 中参数化 Select top 'n'