2010-09-16 55 views
3

如何通過語句獲取組中的所有值?顯示GROUP BY中的所有值

mysql>select * from mytable; 
+------+--------+--------+ 
| name | amount | status | 
+------+--------+--------+ 
| abc |  12 | A  | 
| abc |  55 | A  | 
| xyz |  12 | B  | 
| xyz |  12 | C  | 
+------+--------+--------+ 
4 rows in set (0.00 sec) 

mysql>select name, count(*) from mytable where status = 'A' group by name; 
+------+----------+ 
| name | count(*) | 
+------+----------+ 
| abc |  2 | 
+------+----------+ 
1 row in set (0.01 sec) 

預期結果:

+------+----------+ 
| name | count(*) | 
+------+----------+ 
| abc |  2 | 
| xyz |  0 | 
+------+----------+ 

回答

4

Select name, Sum(status = 'A') 
From mytable 
Group By name; 

這是一般的解決方案也將與其他數據塊比MySQL工作在COUNT(列)計算非空值的數量時可以使用一個有趣的技巧;您也可以使用自加入(在執行此操作時):

SELECT a.name, COUNT(b.name) 
    FROM mytable AS a LEFT OUTER JOIN mytable AS b 
    ON a.name = b.name AND b.status = 'A' 
GROUP BY a.name; 

這將適用於所有版本的SQL;並非所有變體都允許您總結布爾表達式,這在支持時無疑更快且更直接。

另一種方式把它寫爲:

SELECT a.name, COUNT(b.name) 
    FROM mytable AS a LEFT OUTER JOIN 
     (SELECT name FROM mytable WHERE status = 'A') AS b 
    ON a.name = b.name 
GROUP BY a.name; 
+0

:在這種情況下,如果我們想要顯示數量列值,SQL僅返回第一個值,即12!我們能做些什麼來看12和55? – 2013-09-30 16:16:07

+1

您必須指定要更精確地查看的查詢結果。如果你的意思是你想查看組值和單個行值,那麼你應該使用原始表加入GROUP BY查詢的結果(作爲子查詢處理):'SELECT m。*,s.group_count FROM mytable AS m JOIN(SELECT a.name,COUNT(b.name) FROM mytable AS a LEFT OUTER JOIN mytable AS b ON a.name = b.name AND b.status ='A' GROUP BY a。名稱)AS s ON m.name = s.name;'或大約。 – 2013-09-30 16:25:38

+0

老實說,我不明白這個問題: - 你能不能簡單描述一下?我想要的是隻有一個**名稱**作爲父母 – 2013-09-30 16:34:10

3

您當前的解決方案中刪除那些沒有地位A,所以命名xyz丟失的所有記錄。

這應該給你不同的名稱和記錄的計數具有狀態A

Select name, Sum(Case When status = 'A' Then 1 Else 0 End) 
... 
+0

這在上面所示的例子的工作。但不適用於我正在處理的查詢。我想我將不得不使用左連接或其他東西。 – shantanuo 2010-09-16 12:53:06

+0

恐怕上面的例子是我們唯一的信息...請儘量提供更多信息。 – 2010-09-18 06:52:38