Нужна группа близнецов по значению - PullRequest
1 голос
/ 27 сентября 2011

У меня есть запрос примерно такой,

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

, который возвращает явно меньшие значения в разделе grouped_by

+------------+----------------+
| SOME_ID    | WITH_FILTER    |
+------------+----------------+
|  1         | 20             |
|  2         | 15             |
+------------+----------------+

Теперь мне нужен запрос, чтобы дать мне оба значения счетчика, т.е. с условием и без условия в одном запросе. Результат должен быть таким

+----------+----------------+---------------+
| SOME_ID  | WITHOUT_FILTER | WITH_FILTER   |
+----------+----------------+---------------+
|  1       | 40             | 20            |
|  2       | 30             | 15            |
+------------+--------------+---------------+

Пожалуйста, помогите мне.

Ответы [ 5 ]

4 голосов
/ 27 сентября 2011

Вы можете сделать это:

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 голос
/ 27 сентября 2011

В целях обучения, вот мои 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, кстати.

1 голос
/ 27 сентября 2011

Вы можете получить эффект «COUNT, но только для строк, удовлетворяющих условию», используя IF () и SUM.

 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. Если это так, то Адриан является единственным, который действительно является правильным).

0 голосов
/ 27 сентября 2011
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

Или вы можете сделать это с объединением двух представлений, если ваши условия становятся слишком чувствительными

0 голосов
/ 27 сентября 2011

попробуйте 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...