SQL字段的两个计数

SQL字段的两个计数,sql,Sql,我的桌子是 customdata check service loc value 101 0 0 4 4 101 0 0 3 3 101 5 4 4 3 102 0 0 1 2 102 4 4 3 3 103 0 0 4 4 我的

我的桌子是

 customdata check service loc value
  101        0    0        4   4
  101        0    0        3   3
  101        5     4       4    3
  102        0     0       1     2
  102        4     4       3     3
  103        0     0       4     4
我的结果应该是

  customdata cnt splcnt//count of check when not 0
   101        3    1
   102        2    1
   103        1    0

有谁能告诉我,我应该如何让我的查询同时计算这两个计数。

使用
CASE
语句根据
check
的值有条件地
求和

SELECT
    customdata,
    COUNT(*) AS cnt,
    SUM(CASE WHEN check > 0 THEN 1 ELSE 0 END) AS splcnt
FROM YourTable
GROUP BY customdata

表名=tcustomdata,检查重命名为chck的列

SELECT a.customdata, a.cnt AS CNT_ALL, c.cnt AS chckcnt
FROM (SELECT customdata, COUNT(*) AS cnt FROM tcustomdata GROUP BY customdata) a
LEFT OUTER JOIN 
(SELECT customdata, COUNT(*) AS cnt FROM tcustomdata WHERE chck != 0 GROUP BY customdata) c
ON a.customdata = c.customdata

如果您访问sqlfiddle.com并创建表以再次运行sql,那么在

上查看这些问题将更容易回答。我尝试过这一点,但从未奏效,选择count(customdata)作为CNT,customdata,SUM(当check>0时为CASE,然后为1 END)作为splcnt,SUM(locationrating)作为loc,SUM(cleanlinessrating)作为cle,sum(valueformoneyrating)作为val,sum(kitchenequipmentrating)作为来自customdata的反馈组的套件null'和customdata!=''@Indira请更新您的问题以包含您尝试过的代码;另外,请澄清你所说的“永远不起作用”是什么意思。它会抛出错误吗?它不会返回您期望的值吗?如果它没有返回您期望的结果,那么结果与您期望的结果有什么不同?最后,
HAVING
用作聚合值的过滤器。。。我认为
WHERE
子句在该查询中更合适。@Michael也许最好添加一个ELSE(
SUM(CASE WHEN[check]>0然后1 ELSE 0 END)作为splcnt
),因为没有它,“103”的splcnt值为NULL(不是0)。@GmG好的一点。。。如果只有
NULL
值,那么
SUM
将是
NULL
,正如您所说。。。更新后包含了
ELSE
。谢谢你的投票,不过,我承认,另一个答案更好