Sql server 如果单元格不为空,则计数出现次数

Sql server 如果单元格不为空,则计数出现次数,sql-server,dynamic,count,Sql Server,Dynamic,Count,我有一个如下所示的表格: 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

我有一个如下所示的表格:

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
专栏[8月19日],[9月19日]。。。是动态的,将逐月变化


如何实现这一点?

您可能必须在此处使用丑陋的
大小写
表达式:

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
计数只需要执行典型的
groupby
操作。考虑下面的表格:

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;

请考虑放弃目前的方法,以支持一个更好的表格设计。更多信息请参见我的答案。