首页 > 解决方案 > 如何对除主键以外的其他内容求和?

问题描述

想要找到一个非 PK 属性(varchar)的计数,它利用了一个案例。想知道如何实现这一目标?让我们将此属性称为“代码”

如果我在 PK 上这样做,它会是这样的:

SELECT
   sum(case when xx1 = 'apples' and xx2 = 5 then 1 else 0 end) as my_count 
from fruits

抱歉,我应该提一下,“代码”值比 PK 少得多,因此在计数方面不会是 1 比 1。

编辑:假设有 20 个 PK_ID(fruit_id),它们满足水​​果中的 xx1 = 'apples' 和 xx2 = 5。我上面的查询会拉动那个。虽然只有 6 个代码满足水果中相同的 2 个过滤器。我希望我的查询返回值 6。

标签: sql-servertsql

解决方案


不清楚我们正在努力实现什么,但听起来你可能在计算不同的值......

考虑这样的查询:

SELECT COUNT(DISTINCT f.xx1)
  FROM fruits f

如果所有行的 xx1 列中的值是“apples”或“oranges”,则 COUNT(DISTINCT 将返回 2。

我们可以将该模式应用于 CASE 表达式,条件聚合就像 SUM() 获取行数一样。

如果我们不想“计算”一个值,我们可以返回 NULL 来代替一个值。

考虑:

SELECT COUNT(DISTINCT CASE WHEN f.xx1='apples' AND f.xx2=5 THEN f.code ELSE NULL END) AS cnt_dist_code
     , COUNT(         CASE WHEN f.xx1='apples' AND f.xx2=5 THEN   1    ELSE NULL END) AS cnt_rows
  FROM fruits f

我只是在猜测我们正在努力实现的目标。考虑包括一些样本数据和要返回的输出示例,以帮助解释规范。


推荐阅读