111

我有一列“小时”我有一列“种类”(可以是 1,2 或 3)

我想做类似的事情:

SELECT count(id), SUM(hour) as totHour, SUM( IF ( kind = 1, 1, 0 ) ) as countKindOne

或者

SELECT count(id), SUM(hour) as totHour, COUNT( IF ( kind = 1 ) ) as countKindOne

但是mysql告诉我我有一个错误......错误是什么!?

请参阅此 stackoverflow 主题:MySQL SUM IF field b = field a

..我无法回复这个...

4

6 回答 6

196

您可以使用以下CASE语句:

SELECT count(id), 
    SUM(hour) as totHour, 
    SUM(case when kind = 1 then 1 else 0 end) as countKindOne
于 2012-10-25T19:13:12.150 回答
90

你想要类似的东西:

SELECT count(id), SUM(hour) as totHour, SUM(kind=1) as countKindOne;

请注意,您的第二个示例很接近,但 IF() 函数始终采用三个参数,因此它必须是COUNT(IF(kind=1,1,NULL)). 我更喜欢上面显示的 SUM() 语法,因为它很简洁。

于 2012-10-25T19:09:10.287 回答
34

您也可以使用SUM + IFwhich is short than SUM + CASE

SELECT
    count(id)
    , SUM(IF(kind=1, 1, 0)) AS countKindOne
    , SUM(CASE WHEN kind=2 THEN 1 ELSE 0 END) AS countKindTwo
于 2015-05-31T02:27:26.087 回答
10

最佳答案之间存在细微差别,即SUM(case when kind = 1 then 1 else 0 end)SUM(kind=1)

当列中的所有值kind恰好是NULL时,结果SUM(case when kind = 1 then 1 else 0 end)0,而结果SUM(kind=1)NULL

一个例子(http://sqlfiddle.com/#!9/b23807/2):

架构:

CREATE TABLE Table1
(`first_col` int, `second_col` int)
;

INSERT INTO Table1
    (`first_col`, `second_col`)
VALUES
       (1, NULL),
       (1, NULL),
       (NULL, NULL)
;

查询结果:

SELECT SUM(first_col=1) FROM Table1;
-- Result: 2
SELECT SUM(first_col=2) FROM Table1;
-- Result: 0
SELECT SUM(second_col=1) FROM Table1;
-- Result: NULL
SELECT SUM(CASE WHEN second_col=1 THEN 1 ELSE 0 END) FROM Table1;
-- Result: 0
于 2018-10-18T07:38:12.683 回答
3

从MYSQL我解决了这样的问题:

SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as amount_one,

希望这会有所帮助:D

于 2017-11-29T14:28:00.263 回答
1

值得注意的是,您可以通过使用查询中的多个字段来构建 Gavin Toweys 的答案,例如

SUM(table.field = 1 AND table2.field = 2)

您也可以使用此语法COUNT,我相信其他功能也是如此。

于 2019-06-25T08:25:47.960 回答