2010-09-16 49 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