sql-server - 如何对除主键以外的其他内容求和?
问题描述
想要找到一个非 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。
解决方案
不清楚我们正在努力实现什么,但听起来你可能在计算不同的值......
考虑这样的查询:
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
我只是在猜测我们正在努力实现的目标。考虑包括一些样本数据和要返回的输出示例,以帮助解释规范。
推荐阅读
- php - 使用 Restcord 和 Wohali OAuth2 Discord 客户端为用户获取公会角色
- python - 输入输入时,我的显示菜单重复多次
- css - 单击项目时,我可以使光标从项目上移开吗?
- javascript - 从 HTML 元素中提取文本并创建对象
- java - Java - 如何在 HTTP GET 请求中设置本地存储值?
- node.js - 如何在 Angular 6 中制作“过滤器”
- ruby - 用 Regexp.Union 扫描如何在 union \b \ix 中使用带有选项的变量?
- r - R DT 包添加尾随零以对齐小数
- c++ - 线程如何更改睡眠时间
- xcode - 当我运行命令 react-native run-ios 时。为什么应用程序不存在?