需要一个双人组的价值

时间:2011-09-27 15:04:28

标签: mysql sql group-by

我有一个像这样的查询,

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            |
+------------+--------------+---------------+

请帮帮我。

5 个答案:

答案 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个视图合并