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;
请考虑放弃目前的方法,以支持一个更好的表格设计。更多信息请参见我的答案。