簡體   English   中英

MySQL COUNT分組依據或不同

[英]MySQL COUNT with group by or distinct

我有表“對象”:

id (int)
name (varchar)
group_id (varchar) default null

我做了一些插入:

insert into objects values
(null, 'Cat', null),
(null, 'Dog', null),
(null, 'Mouse', 'AAA'),
(null, 'Eagle', 'BBB'),
(null, 'Elephant', null),
(null, ' Bull', 'AAA');

我需要計算總行數。 但是,group_id為“ AAA”的兩行應合並為單行。 在上面的示例中,“ count”應返回“ 5”。 這是因為:

  • “ group_id”字段共有3行,其值為NULL
  • 有group_id為“ BBB”的行的“出現次數”為1
  • 有group_id為“ AAA”的行的“出現次數”為1

用group_id進行計數似乎不是解決方案,因為它返回3行,並且每行給出一個計數。 我只需要總行數。

使用DISTINCT似乎也無濟於事。 查詢:

select count(distinct(group_id)) from objects;

返回值為“ 2”的行

使用條件分組:

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END

COUNT()僅對NON_NULL值遞增,因此

select count(distinct IFNULL(group_id,'-9nTfx')) from objects;

將從您的樣本數據中返回3,“ AAA”,“ BBB”和NULL分別為1。

您要求的結果是5,所以我建議這樣做:

select
  count(distinct group_id) 
  + count(case when group_id IS NULL then 1 end) 
from objects;
  • 請注意,DISTINCT不是函數,因此當您編寫DISTINCT(group_id)時,那些括號將被忽略。 順便說一句,“選擇不同的(某些列)”也是如此。

@used_by_already解釋得很好。 我剛剛完成了這個演示

查看工作演示

存在第二個答案作為要考慮的測試結果。

這個SQL小提琴

MySQL 5.6模式設置

查詢2

SELECT COUNT(*) FROM objects 
GROUP BY CASE
    WHEN group_id IS NULL THEN id
    ELSE group_id
    END

結果

| COUNT(*) |
|----------|
|        1 |
|        1 |
|        1 |
|        2 |
|        1 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM