【问题标题】:Get the Count of not null date from the same row从同一行获取非空日期的计数
【发布时间】:2019-11-19 06:11:49
【问题描述】:

感觉这应该是一件容易的事。如何获取不同列中日期不为空的单元格计数。

DROP TABLE #indebtedness
CREATE TABLE #indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
INSERT #indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30',      null   )
INSERT #indebtedness VALUES ('Key2',   NULL      ,     null    , '2019-10-15')
INSERT #indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
INSERT #indebtedness VALUES ('Key4',     null    , '2019-10-29', '2019-10-13')

我希望结果是:

call_case    NOT NULL
Key1            2 
Key2            1 
Key3            3
Key4            2 

【问题讨论】:

    标签: sql sql-server tsql count sum


    【解决方案1】:

    应该这样做:

    SELECT 
      call_case, 
      CASE WHEN date1 IS NOT NULL THEN 1 ELSE 0 END + 
        CASE WHEN date2 IS NOT NULL THEN 1 ELSE 0 END + 
        CASE WHEN date3 IS NOT NULL THEN 1 ELSE 0 END 
      AS "NOT NULL"
    FROM indebtedness
    ;
    

    【讨论】:

      【解决方案2】:

      如果列很多并且您不想对它们进行硬编码或制作复杂的逻辑 - 例如检查具有特定类型或名称的列,您可以使用系统视图来构建这样的动态表达式。

      在你的情况下:

      DROP TABLE dbo.indebtedness
      CREATE TABLE dbo.indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
      INSERT dbo.indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30',      null   )
      INSERT dbo.indebtedness VALUES ('Key2',   NULL      ,     null    , '2019-10-15')
      INSERT dbo.indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
      INSERT dbo.indebtedness VALUES ('Key4',     null    , '2019-10-29', '2019-10-13')
      
      
      DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
             ,@DynamicColumns NVARCHAR(MAX);
      
      SET @DynamicColumns = STUFF
                                (
                                      (
                                          SELECT ' + CASE WHEN ' + QUOTENAME(C.[name]) + 'IS NULL THEN 0 ELSE 1 END'
                                          FROM [sys].[columns] C
                                          INNER JOIN [sys].[types] T
                                              ON C.[system_type_id] = T.[system_type_id]
                                          WHERE [object_id] = OBJECT_ID('dbo.indebtedness')
                                              AND T.[name] = 'datetime'
                                          ORDER BY C.[name]
                                          FOR XML PATH('') ,TYPE
                                      ).value('.', 'NVARCHAR(MAX)')
                                      ,1
                                      ,3
                                      ,''
                                );
      
      SET @DynammicTSQLStatement = 'SELECT call_case, ' + @DynamicColumns + ' AS [NOT NULL] FROM dbo.indebtedness;'
      
      EXEC sp_executesql @DynammicTSQLStatement;
      

      【讨论】:

        【解决方案3】:

        您可以使用联合将三列对齐,然后利用 COUNT 函数:

        WITH cte AS (
            SELECT call_case, date1 AS date FROM #indebtedness UNION ALL
            SELECT call_case, date2 FROM #indebtedness UNION ALL
            SELECT call_case, date3 FROM #indebtedness
        )
        
        SELECT
            call_case,
            COUNT(date) AS [NOT NULL]
        FROM cte
        GROUP BY
            call_case;
        

        实际上,如果您对类似的查询有长期需求,这可能意味着您的数据模型应该更改,并且您应该只有一个日期列。

        【讨论】:

          【解决方案4】:

          由于null 值,这非常棘手,我使用了sql server min date 17530101 这些空值的基础。

          select call_case, iif(coalesce(date1, '17530101')='17530101', 0, 1) 
              + iif(coalesce(date2, '17530101')='17530101', 0, 1) 
              + iif(coalesce(date3, '17530101')='17530101', 0, 1) from
          #indebtedness 
          

          select call_case, iif(isnull(date1,0)=0, 0, 1) 
              + iif(isnull(date2,0)=0, 0, 1) 
              + iif(isnull(date3,0)=0, 0, 1)  from
          #indebtedness 
          

          【讨论】:

            猜你喜欢
            • 2015-06-08
            • 2016-11-18
            • 2023-02-18
            • 2021-08-26
            • 1970-01-01
            • 2020-11-04
            • 2021-08-16
            • 2023-03-14
            • 1970-01-01
            相关资源
            最近更新 更多