我有桌子
cab | name | value |
---|---|---|
1 | PHP | 1 |
1 | PHP | 2 |
1 | PHP | 0 |
2 | LHL | 0 |
3 | GHG | 3 |
3 | GHG | 2 |
我期待得到不同的出租车和名称加上多少值=0和多少是0 结果表应如下所示:
cab | name | value=0 | value>0 |
---|---|---|---|
1 | PHP | 1 | 2 |
2 | LHL | 1 | 0 |
3 | GHG | 0 | 2 |
第三列表示有多少个值=0 第四列表示值0
我已经试了一整天,但我似乎不能找出正确的SQL语句,
我有桌子
cab | name | value |
---|---|---|
1 | PHP | 1 |
1 | PHP | 2 |
1 | PHP | 0 |
2 | LHL | 0 |
3 | GHG | 3 |
3 | GHG | 2 |
我期待得到不同的出租车和名称加上多少值=0和多少是0 结果表应如下所示:
cab | name | value=0 | value>0 |
---|---|---|---|
1 | PHP | 1 | 2 |
2 | LHL | 1 | 0 |
3 | GHG | 0 | 2 |
第三列表示有多少个值=0 第四列表示值0
我已经试了一整天,但我似乎不能找出正确的SQL语句,
这里不需要子查询或DISTINCT
,这是conditional aggregation
的用例.
我们将简单地使用GROUP BY
并将值= 0和值0的占用求和.
如果列value
不可为空,则如下所示:
SELECT
cab,
name,
SUM(value = 0) AS "value=0",
SUM(value > 0) AS "value>0"
FROM yourtable
GROUP BY
cab, name
ORDER BY
cab;
如果列为空,则上述查询可以返回NULL
.如果不是故意的,我们可以在总和周围使用COALESCE
来强制执行结果0
:
SELECT
cab,
name,
COALESCE(SUM(value = 0),0) AS "value=0",
COALESCE(SUM(value > 0),0) AS "value>0"
FROM yourtable
GROUP BY
cab, name
ORDER BY
cab
试用here
注意:我更喜欢双引号表示别名,因为这是标准SQL.如果因为任何原因必须禁用ANSI_QUOTE
,你更需要反勾.