我正在运行一个查询,以从SQL Server中提取逐月数据。我需要添加一个额外的列“Count”,该列捕获值大于“0”的所有列的计数
| 一月|二月|马尔|计数|
| - ------|- ------|- ------|- ------|
| 十三|无|二十五|第二章|
| 十一|十个|四个|三个|
| 无|无|七|1个|
下面是我尝试的SQL查询,但是很快意识到这种case表达式可能不是捕获所有可能组合的最佳方式。
有人能提出更好的解决办法吗?
SELECT
, P.January as 'Jan'
, P.February as 'Feb'
, P.March as 'Mar',
CASE
WHEN P.January > 0 AND P.February > 0 AND P.March > 0 THEN '3'
WHEN P.January < 0 AND P.February > 0 AND P.March > 0 THEN '2'
....
ELSE ''
END as 'Count'
4条答案
按热度按时间92vpleto1#
正如@JohnCappelletti在评论中所说,你可以像这样使用漂亮的
Sign
函数(假设值〉=0):vsaztqbk2#
如果没有负值,我们可以利用
CONVERT(bit, 13)
产生1
的事实,并从CROSS APPLY
中获得SUM
:如果有不应计数的负值,只需添加
col + ABS(col)
即可将负值更改为0,将正值加倍,并保持0不变。hl0ma9xz3#
下面是一个灵活的解决方案,无论列数如何,它都能正常工作。
SQL语言
产出
| 一月|二月|马尔|四月|五月|计数|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 十三|无|二十五|无|第二章|三个|
| 十一|十个|四个|1个|十八|五个|
| 无|无|七|无|七|第二章|
amrnrhlw4#
我认为这是
IIF
的一个很好的用例,请参见documentation。查询将是这样一个: