SQL Server 对包含数据的列进行计数

omqzjyyz  于 2023-01-20  发布在  其他
关注(0)|答案(4)|浏览(158)

我正在运行一个查询,以从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'
92vpleto

92vpleto1#

正如@JohnCappelletti在评论中所说,你可以像这样使用漂亮的Sign函数(假设值〉=0):

SELECT 
, P.January as 'Jan'
, P.February as 'Feb'
, P.March as 'Mar'
, Sign(P.January) + Sign(P.February) + Sign(P.March) /*other months*/ as Count
FROM P
vsaztqbk

vsaztqbk2#

如果没有负值,我们可以利用CONVERT(bit, 13)产生1的事实,并从CROSS APPLY中获得SUM

SELECT s.Jan, s.Feb, s.Mar, 
  [Count] = SUM(CONVERT(int, CONVERT(bit, x.v)))
FROM dbo.YourTableName AS s
CROSS APPLY (VALUES(s.Jan),(s.Feb),(s.Mar)) AS x(v)
GROUP BY s.Jan, s.Feb, s.Mar;

如果有不应计数的负值,只需添加col + ABS(col)即可将负值更改为0,将正值加倍,并保持0不变。

SELECT s.Jan, s.Feb, s.Mar, 
  [Count] = SUM(CONVERT(int, CONVERT(bit, x.v + ABS(x.v))))
  -------------------------------------------^^^^^^^^^^^
FROM dbo.YourTableName AS s
CROSS APPLY (VALUES(s.Jan),(s.Feb),(s.Mar)) AS x(v)
GROUP BY s.Jan, s.Feb, s.Mar;
hl0ma9xz

hl0ma9xz3#

下面是一个灵活的解决方案,无论列数如何,它都能正常工作。

SQL语言

-- DDL and sample data population, start
DECLARE @tbl TABLE (Jan int, Feb int, Mar INT, Apr INT, May INT);
INSERT @tbl (Jan,Feb,Mar, Apr, May) VALUES
(13, 0,  25, 0, 2),
(11, 10, 4,  1, 18),
(0,  0,  7,  0, 7);
-- DDL and sample data population, end

SELECT t.*
   , [Count] = x.value('count(/root/*[not(text()="0")]/text())', 'INT')
FROM @tbl AS t
CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE, ROOT('root')) AS t1(x);

产出

| 一月|二月|马尔|四月|五月|计数|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 十三|无|二十五|无|第二章|三个|
| 十一|十个|四个|1个|十八|五个|
| 无|无|七|无|七|第二章|

amrnrhlw

amrnrhlw4#

我认为这是IIF的一个很好的用例,请参见documentation
查询将是这样一个:

SELECT 
Jan, Feb, Mar,
IIF(Jan > 0, 1, 0) + IIF(Feb > 0, 1, 0) + IIF(Mar > 0, 1, 0) AS [Count]
FROM p;

相关问题