SQL-запрос не имеет значения - PullRequest
0 голосов
/ 01 мая 2018

У меня есть следующая таблица:

------+-------------+------------+----------------+------------------------------------------------+
| id   | customer_id | date       | action_type_id | details                                        |
+------+-------------+------------+----------------+------------------------------------------------+
| 4225 |         324 | 2015-09-07 |              1 | Sent mail Malcolm Murrey                       |
| 6320 |         324 | 2017-05-08 |              3 | quotes for price.                              |
|  156 |         326 | 2013-07-25 |              3 | Site visit to price job                        |
|  943 |         326 | 2013-10-23 |              1 | Arranged visit for snags on panel              |
| 1135 |         326 | 2013-11-28 |              1 | Arranged visit for site mod                    |
| 1930 |         326 | 2014-04-15 |              2 | Quoted for new HMI                             |
| 2644 |         326 | 2014-10-20 |              2 | Sent email about pending quote for HMI         |
| 2821 |         326 | 2014-11-25 |              1 | Screen problem                                 |
| 2184 |         328 | 2014-07-21 |              1 | Sent email detailing services                  |
+------+-------------+------------+----------------+------------------------------------------------+

Я пытаюсь найти customer_id клиентов, у которых нет action_type_id из 2. В данном случае 324 и 328, но просто не могу понять это.

Я думал, что мог бы сделать что-то вроде group by customer_id not having action_type_id = 2 .... любая помощь очень ценится.

Ответы [ 5 ]

0 голосов
/ 01 мая 2018

Это должно работать:

SELECT customer_id FROM customers WHERE action_type_id <> 2
0 голосов
/ 01 мая 2018

Почему бы просто не использовать not exist:

select * 
from table t
where not exists (select 1 from table 
                  where customer_id  = t.customer_id and 
                        action_type_id = 2);
0 голосов
/ 01 мая 2018

Почему бы и нет,

select distinct customer_id from customer where  action_type_id <> 2
0 голосов
/ 01 мая 2018

Я бы использовал агрегацию:

select customerid
from t
group by customerid
having sum(action_type_id = 2) = 0;

Я считаю, что использование group by и having для этого типа запроса очень гибкое в условиях, которые могут у вас возникнуть (скажем, вы хотите 2 и 3, или не 2, а 3 или 4).

0 голосов
/ 01 мая 2018

Вы можете сделать это путем левого присоединения к себе на записях с идентификатором 2, затем отфильтровывать записи без совпадения.

Что-то вроде

SELECT DISTINCT customer_id 
FROM customer a
LEFT JOIN customer b
ON a.customer_id = b.customer_id
AND b.action_type_id = 2
WHERE b.customer_id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...