【问题标题】:Divide count by count(*) in SQL Server在 SQL Server 中除以 count(*)
【发布时间】:2017-04-13 15:07:15
【问题描述】:

这是我的查询:

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 中对我不起作用,我想知道是否有任何方法可以做到这一点?谢谢

【问题讨论】:

  • 所以这个看似“简单”的问题收集了一些非常有趣的答案和cmets...

标签: sql sql-server count alias divide


【解决方案1】:

代替

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

你可以使用

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

【讨论】:

  • 多么有趣!
  • 简单多了,+1
  • 天哪,你是怎么想出来的!?为什么 1.0 有效而不是 1?棘手
  • 使用 Laravel \DB::raw() (orderBy AVG of join), +1
  • 参考 1.0 技巧。将 int/int 相除得到 int。将 int/numeric、numeric/int 或 numeric/numeric 相除得到数字。你可以检查 select sql_variant_property(1/1.0, 'basetype')。
【解决方案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

【讨论】:

  • 你是对的!知道如何过滤,因此您只保留 > 5% 的百分比(例如)。谢谢!
  • 想通了! 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 **WHERE pct > 5** ORDER BY pct DESC
  • 您好,对这些有点新,但是“num”是从哪里来的?我没有看到它在任何地方被调用?
【解决方案3】:

不幸的是,你不能像在 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 表示百分比)。

【讨论】:

  • 赞成整数除法补救措施!
  • “你不能”使这是一个错误的答案。
  • COUNT 总是返回一个整数,不管它的输入。你需要1.0 * COUNT(...)SUM
  • @hvd 这是一个很好的答案,如果你仔细阅读这个问题:-)
  • 但是别名没有明确的定义吗?
【解决方案4】:

好吧,我自己找到了:

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

【讨论】:

  • 这也是我的方法。顺便说一句,除以 nb_null / total 会得到 0!
  • 没错。还有一些其他方法也可以使用,例如WITH req AS (SELECT ...) SELECT nb_null/total FROM req;
【解决方案5】:

我会这样写:

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

【讨论】:

  • t 可能是真实查询中的外部连接表?
  • 从来没有人可以惹@Gordon。他在这个星球之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2020-10-07
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多