【问题标题】:Count occurrences if cell is not null如果单元格不为空,则计算出现次数
【发布时间】:2020-05-27 14:33:52
【问题描述】:

我有一张如下图的表格:

Code   Aug-19   Sep-19  Oct-19  Nov-19  Dec-19  Jan-20  Consistency
--------------------------------------------------------------------
ABC     NULL    501.2   584.56  NULL    NULL    NULL        NULL
DEF     NULL    NULL    NULL    260.4   222    323.77       NULL

我需要将月份列中的事件更新为

Code   Aug-19   Sep-19  Oct-19  Nov-19  Dec-19  Jan-20  Consistency
--------------------------------------------------------------------
ABC     NULL    501.2   584.56  NULL    NULL    NULL        2
DEF     NULL    NULL    NULL    260.4   222    323.77       3

[Aug-19]、[Sep-19]...列是动态的,会逐月变化。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql-server dynamic count


    【解决方案1】:

    你可能不得不在这里使用丑陋的CASE 表达式:

    UPDATE yourTable
    SET Consistency = CASE WHEN [Aug-19] IS NOT NULL THEN 1 ELSE 0 END +
                      CASE WHEN [Sep-19] IS NOT NULL THEN 1 ELSE 0 END +
                      CASE WHEN [Oct-19] IS NOT NULL THEN 1 ELSE 0 END +
                      CASE WHEN [Nov-19] IS NOT NULL THEN 1 ELSE 0 END +
                      CASE WHEN [Dec-19] IS NOT NULL THEN 1 ELSE 0 END +
                      CASE WHEN [Jan-20] IS NOT NULL THEN 1 ELSE 0 END;
    

    请注意,需要这样做是一个严重的迹象,表明您的数据库表设计不是最佳的。最好只维护一个日期列。然后,获取每个代码的非NULL 计数只需要典型的GROUP BY 操作。考虑一个如下所示的表格:

    Code | Date         | Val
    ABC  | '2019-08-01' | NULL
    ABC  | '2019-09-01' | 501.2
    ABC  | '2019-10-01' | 584.56
    ABC  | '2019-11-01' | NULL
    ABC  | '2019-12-01' | NULL
    ABC  | '2029-01-01' | NULL
    DEF  | '2019-08-01' | NULL
    DEF  | '2019-09-01' | NULL
    DEF  | '2019-10-01' | NULL
    DEF  | '2019-11-01' | 260.4
    DEF  | '2019-12-01' | 222
    DEF  | '2029-01-01' | 323.77
    

    现在你只需要这个查询:

    SELECT
        Code,
        COUNT(Val) AS Consistency
    FROM yourNewTable
    GROUP BY
        Code;
    

    【讨论】:

    • 请考虑放弃您当前的方法,转而采用更好的表格设计。有关更多信息,请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2022-11-24
    • 1970-01-01
    相关资源
    最近更新 更多