GROUP BY在特定条件下

时间:2015-01-27 10:07:33

标签: mysql group-by case

我在查询的GROUP BY部分遇到了一些MySQL问题。 我想在GROUP BY中使用一列,但这只应用于某个依赖于行中值的特定条件。我们说我有这张桌子:

mysql> SELECT * FROM test_table;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 2 |
| 4 | 2 | 2 |
| 5 | 2 | 3 |
| 6 | 3 | 1 |
| 7 | 2 | 2 |
+---+---+---+
7 rows in set (0.00 sec)

现在我想检索所有行,它们只应在列c上使用GROUP BY,当b === 1.这意味着我想要返回6行,因为行数为2和3应该分组。所以我提出了以下查询,它没有给我预期的结果。

mysql> SELECT * FROM test_table GROUP BY CASE WHEN b = 1 THEN c END;
+---+---+---+
| a | b | c |
+---+---+---+
| 4 | 2 | 2 |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
+---+---+---+
3 rows in set (0.00 sec)

我可能在CASE语句和GROUP BY的组合中遗漏了一些内容,我希望你们中的任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

您可以使用简单的GROUP BY子句,其中bc列以逗号分隔:

SELECT * 
FROM test_table 
GROUP BY CASE WHEN b=1 THEN c ELSE a END;

<强>结果:

A   B   C
1   1   1
2   1   2
4   2   2
5   2   3
6   3   1
7   2   2

请参阅SQL Fiddle中的结果。

答案 1 :(得分:0)

根据您所需的输出,您可能需要在这些行上执行某些操作

SELECT c, count(*) FROM test_table where b=1 GROUP BY c
UNION 
SELECT c, count(*) FROM test_table where b<>1