2012-01-12 42 views
3

執行WITH ROLLUP由多個字段分組時,MySQL的返回每個組彙總行,以及整體的總結:MySQL只得到整體ROLLUP

CREATE TABLE test (name VARCHAR(50), number TINYINT); 
INSERT INTO test VALUES 
    ('foo', 1), ('foo', 1), ('foo', 2), ('foo', 3), ('foo', 3), 
    ('bar', 1), ('bar', 2), ('bar', 2), ('bar', 2), ('bar', 3), 
    ('baz', 1), ('baz', 2), ('bar', 2); 
SELECT name, number, COUNT(1) FROM test GROUP BY name, number WITH ROLLUP; 

+------+--------+----------+ 
| name | number | count(1) | 
+------+--------+----------+ 
| bar |  1 |  1 | 
| bar |  2 |  3 | 
| bar |  3 |  1 | 
| bar | NULL |  5 | 
| baz |  1 |  1 | 
| baz |  2 |  2 | 
| baz | NULL |  3 | 
| foo |  1 |  2 | 
| foo |  2 |  1 | 
| foo |  3 |  2 | 
| foo | NULL |  5 | 
| NULL | NULL |  13 | 
+------+--------+----------+ 

我不感興趣的彙總foo的/ bar/baz,只是整體總結。什麼是最高效的方式來實現這一點?

我知道我不能使用HAVING,因爲之後會添加彙總行。爲此使用嵌套查詢的最佳解決方案是,選擇名稱和數字都是NOT NULL還是兩者都是NULL

回答

3

HAVING可以做的伎倆,沒有子查詢:

SELECT `name`, number, COUNT(1) FROM test GROUP BY `name`, number WITH ROLLUP 
HAVING number IS NOT NULL OR `name` IS NULL; 

這過濾掉彙總後的行除了總計:

name number COUNT(1) 
------ ------ -------- 
bar   1   1 
bar   2   4 
bar   3   1 
baz   1   1 
baz   2   1 
foo   1   2 
foo   2   1 
foo   3   2 
(NULL) (NULL)  13 
+0

作爲參考,當時我相信我使用的是過時的MySQL版本,這導致了我的最後一段。 5.5在2012年支持HAVING子句中的ROLLUP值,但較舊的5.0和5.1沒有:https://forums.mysql.com/read.php?12106959,263513 – cmbuckley 2017-12-28 14:12:14

3

嘗試使用子查詢,例如 -

SELECT * FROM (
    SELECT name, number, COUNT(1) FROM test GROUP BY name, number WITH ROLLUP) t 
WHERE name IS NULL OR number IS NULL 

您還可能需要使用適當的文本更改NULL值。

+0

如果他只想要總計,您可能需要更新哪裏... WHERE不是名稱爲空或(名稱爲空且數字爲空),因此它僅排除名稱/編號分組的彙總,但包括總的總數。 – DRapp 2012-01-12 15:16:28

+0

是的,你是對的。另外,爲了僅獲得總體摘要,足以運行此查詢 - SELECT'TOTAL'總計COUNT(1)FROM test; – Devart 2012-01-12 15:41:33

+0

我認爲這與我所追求的非常接近;實際上我是在'WHERE name是NULL或者數字不是NULL'之後。希望數據集應該足夠小,即使在子查詢中也能保持高效。 – cmbuckley 2012-01-12 15:52:12

0
SELECT COALESCE(name, 'TOTAL') as Name, number, COUNT(1) FROM test GROUP BY name, number WITH ROLLUP; 

下面名稱欄中會顯示作爲Total。如果你對數字有問題,那麼null也可以完成。

+0

其意圖是排除行,而不是結合空值。 – cmbuckley 2017-12-28 14:18:00