我有一个像这样的查询,
SELECT SOME_ID, COUNT(ANOTHER_ID) AS WITHOUT_FILTER
from SOME_TABLE GROUP BY SOME_ID
这会让我回头
+------------+------------------+
| SOME_ID | WITHOUT_FILTER |
+------------+------------------+
| 1 | 40 |
| 2 | 30 |
+------------+------------------+
我有一个相同的查询,条件为我提供过滤值。
SELECT SOME_ID, COUNT(ANOTHER_ID) AS WITH_FILTER
from SOME_TABLE WHERE SOME_COL > 10 GROUP BY SOME_ID
在groups_by部分
中返回明显较小的值+------------+----------------+
| SOME_ID | WITH_FILTER |
+------------+----------------+
| 1 | 20 |
| 2 | 15 |
+------------+----------------+
现在,我需要一个查询来给我两个计数值,即在一个查询中有条件和无条件。结果应该是这样的
+----------+----------------+---------------+
| SOME_ID | WITHOUT_FILTER | WITH_FILTER |
+----------+----------------+---------------+
| 1 | 40 | 20 |
| 2 | 30 | 15 |
+------------+--------------+---------------+
请帮帮我。
答案 0 :(得分:4)
你可以这样做:
SELECT
SOME_ID,
COUNT(ANOTHER_ID) AS WITHOUT_FILTER
SUM(case when SOME_CONDITION then 1 else 0 end) AS WITH_FILTER
from SOME_TABLE GROUP BY SOME_ID
答案 1 :(得分:1)
您可以使用IF()和SUM获得“COUNT,但仅限于符合条件的行”效果。
SELECT SOME_ID,
COUNT(ANOTHER_ID) AS WITHOUT_FILTER,
SUM(IF(SOME_COL > 10, 1, 0)) AS WITH_FILTER
FROM SOME_TABLE GROUP BY SOME_ID
(注意:如果ANOTHER_ID永远为NULL,这个解决方案以及除Adrian之外的所有其他解决方案都有一个微妙的问题。如果是这样的话,那么Adrian是唯一真正正确的问题。)
答案 2 :(得分:1)
出于学习目的,这是我的2美分。您可以在两个字段中使用COUNT
:
SELECT SOME_ID,
COUNT(ANOTHER_ID) AS WITHOUT_FILTER
COUNT(case
when WHEN SOME_COL > 10 then ANOTHER_ID
else NULL
end) AS WITH_FILTER
from SOME_TABLE GROUP BY SOME_ID
诀窍是COUNT
计算非空值。此功能支持ANSI SQL,BTW。
答案 3 :(得分:0)
尝试CASE和SUM合并:
SELECT SOME_ID, COUNT(ANOTHER_ID) as WITHOUT_FILTER,
SUM(CASE WHEN SOME_COL > 10 THEN 1 else 0 END) as WITH_FILTER
from SOME_TABLE GROUP BY SOME_ID;
答案 4 :(得分:0)
SELECT T1.SOME_ID,
COUNT(T1.ANOTHER_ID) AS WITH_FILTER,
COUNT(T2.ANOTHER_ID) AS WITHOUT_FILTER
FROM SOME_TABLE as T1,
SOME_TABLE as T2
WHERE
T1.SOME_ID=T2.SOME_ID
AND T2.SOME_COL > 10
GROUP BY T1.SOME_ID, T2.SOME_ID
或者如果您的条件变得过于敏感,您可以使用2个视图合并