在SQL Server中按计数(*)除以计数

问题描述 投票:5回答:5

这是我的查询:

SELECT 
    COUNT(*) AS total,
    COUNT(CASE WHEN t.id IS NULL THEN 1 END) AS nb_null,
    COUNT(CASE WHEN t.id IS NOT NULL THEN 1 END) AS nb_not_null
FROM
    table t

是否可以通过别名划分字段? :

SELECT 
    COUNT(*) AS total,
    COUNT(CASE WHEN t.id IS NULL THEN 1 END) / total AS nb_null,
    COUNT(CASE WHEN t.id IS NOT NULL THEN 1 END) AS nb_not_null
FROM
    table t

它在SQL Server中对我不起作用,我想知道是否有任何方法可以做到这一点?谢谢

sql sql-server count alias divide
5个回答
13
投票

代替

COUNT(CASE WHEN t.id is null THEN 1 END)/Count(*) 

您可以使用

AVG(CASE WHEN t.id is null THEN 1.0 ELSE 0 END)

2
投票

不幸的是你不能在Sql Server中使用像这样的alias;你必须重复这个表达。你可以(正如你已经找到的和其他人发布的那样)使用子查询/ cte / join等来返回带有该别名的列并使用它,但那就是列/表达式的名称,而不是别名。

SELECT Count(*) as total,
count(CASE WHEN t.id is null THEN 1 END)/(Count(*)+.0)  as nb_null,
COUNT(CASE WHEN t.id is not null THEN 1 END) as nb_not_null
from table t

此外,将+.0添加到除法方程的任一侧以避免整数除法(返回0而不是0.dddd表示百分比)。


2
投票

我需要使用任意数量的功能(不仅是null与非null)来解决类似的问题,我还希望将它们转换为百分比。这可能对您或其他有类似问题的人有所帮助:

WITH counts AS 
  (SELECT [feature], 
  COUNT(*) AS cnt
  FROM [your_table]
  GROUP BY [feature])
SELECT [feature], CAST(100 * num AS DOUBLE) / (SELECT SUM(num) FROM counts) 
  AS pct
FROM counts
ORDER BY pct DESC

1
投票

好的,我自己找到了:

SELECT nb_null/total from(
   SELECT Count(*) as total,
   COUNT(CASE WHEN t.id is null THEN 1 END) as nb_null,
   COUNT(CASE WHEN t.id is not null THEN 1 END) as nb_not_null
   from table t
) as req

1
投票

我会这样写:

select Count(*) as total,
       avg(case when t.id is null then 1.0 else 0 end) as nb_null,
       count(t.id) as nb_not_null
from table t;

COUNT(<col>)的定义是它计算非NULL值;你可能会很好地使用内置函数。

然而,为什么一个名为id的专栏可能是NULL超出我的范围。它应该被宣布为NOT NULL

© www.soinside.com 2019 - 2024. All rights reserved.