MySQL - запрос - несколько групп по - PullRequest
7 голосов
/ 16 февраля 2011

У меня есть следующая таблица, в которой я пытаюсь подвести СУММУ, если type = 'printer', однако я не хотел бы считать повторяющиеся client_ids.Поэтому я ожидаю что-то вроде этого:

+------+-----------+-----------+
| k_id | client_id | type      |
+------+-----------+-----------+
|    1 |       100 | pc        | 
|    2 |       101 | printer   | 
|    3 |       101 | printer   | 
|    4 |       101 | printer   | 
|    5 |       102 | cellphone | 
+------+-----------+-----------+

Запрос:

  SELECT client_id, 
         SUM(IF(type = 'printer', 1,0)) 
    FROM FOO 
GROUP BY type, client_id;

Результат:

+-----------+--------------------------------+
| client_id | SUM(IF(type = 'printer', 1,0)) |
+-----------+--------------------------------+
|       102 |                              0 | 
|       100 |                              0 | 
|       101 |                              3 | 
+-----------+--------------------------------+

Ожидаемый результат:

+-----------+--------------------------------+
| client_id | SUM(IF(type = 'printer', 1,0)) |
+-----------+--------------------------------+
|       102 |                              0 | 
|       100 |                              0 | 
|       101 |                              1 | 
+-----------+--------------------------------+

Ответы [ 4 ]

8 голосов
/ 16 февраля 2011

Использование:

   SELECT x.client_id,
          COUNT(DISTINCT y.type) 
     FROM FOO x
LEFT JOIN FOO y ON y.client_id = x.client_id
               AND y.type = 'printer'
 GROUP BY x.client

Если вам не нужно видеть строки с нулевым счетом:

   SELECT client_id, 
          COUNT(DISTINCT type)
     FROM FOO 
    WHERE type = 'printer'
 GROUP BY type, client_id;
7 голосов
/ 16 февраля 2011

Есть три строки с типом printer. Sum складывает их все и возвращает 3.

Если вы хотите увидеть 1 для строк с принтерами, а 0 в противном случае, попробуйте max вместо sum:

MAX(IF(type = 'printer', 1,0))
^^^

РЕДАКТИРОВАТЬ: Чтобы подсчитать количество различных принтеров, вы можете использовать подзапрос:

SELECT  client_id
,       (
        select  count(*) 
        from    FOO as f2 
        where   f1.client_id = f2.client_id
                and type = 'Printer'
        )
FROM    FOO as f1
GROUP BY 
        client_id
1 голос
/ 17 августа 2012
SELECT client_id, if( `type` = 'printer', 1, 0 )
FROM foo
GROUP BY TYPE , client_id
0 голосов
/ 16 февраля 2011
SELECT distinct client_id, 
     (IF(type = 'printer', 1,0)) 
FROM FOO 

(наверное: я не знаком с IF (..))

...