нужно выбрать идентификаторы клиентов, чья первая покупка в 2000 году - sql - PullRequest
0 голосов
/ 25 января 2019

Я пишу запрос для создания списка для целевой аудитории для маркетинговой кампании.Список должен соответствовать следующим критериям:
- Номер кредитной карты начинается с 100 0r 110
- Клиент живет в городе A - Кредитная карта клиента не существует в таблице Campaign.- У клиента есть номер телефона (есть две колонки для телефонных номеров PHONE1 и PHONE2) -Клиент имеет адрес электронной почты -Первая дата покупки в 2000

SELECT cust_id
min(purchase_date) = 2000 
FROM customers
WHERE cardno not in (SELECT cardno FROM campaign WHERE cust_cardno = 
campaign.cardno) 
AND City = "A"
AND Email IS NOT NULL
AND cardno LIKE '[100-110]%'
AND PHONE1, PHONE2 IS NOT NULL 
OR PHONE1 IS NOT NULL
OR PHONE2 IS NOT NULL;  

Некоторые запросы не верны, они: 1) Номер кредитной карты начинается с 100 0r 110 -> И cardno LIKE '[100-110]%' 2) У клиента есть номер телефона (есть две колонки для телефонных номеров PHONE1 и PHONE2) -> И PHONE1, PHONE2 ISNOT NULL ИЛИ PHONE1 НЕ НУЛЬ ИЛИ PHONE2 НЕ НУЛЕВ 3) Дата первой покупки должна быть в 2000 году -> min (purchase_date) = 2000 Какие ошибки в этих запросах?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

У вас есть несколько ошибок. Например, min() без group by. Фильтрация после агрегации, но не having. Условия фильтрации связаны запятыми. Отсутствие запятых и т. Д.

Итак, я думаю, вы хотите:

SELECT cust_id
FROM customers as c
WHERE NOT EXISTS (SELECT 1 FROM campaign ca WHERE ca.cardno = c.cust_cardno) AND
      City = "A"
      Email IS NOT NULL AND
      LEFT(cardno, 3) IN ('100', '110') AND
      (PHONE1 IS NOT NULL OR
       PHONE2 IS NOT NULL 
      )
GROUP BY cust_id
HAVING min(purchase_date) = 2000 ;

Обратите внимание, что я заменил NOT IN на NOT EXISTS. NOT IN не работает должным образом, если любая из возвращенных строк NULL.

Я также изменил логику «начать с».

0 голосов
/ 25 января 2019

отметьте это

SELECT c.cust_id
FROM customers c
WHERE cardno not in (SELECT cardno FROM campaign ) 
AND City = "A"
AND Email IS NOT NULL
AND (cardno LIKE '[100]*' OR  cardno LIKE '[110]*')
AND  (PHONE1 IS NOT NULL
OR PHONE2 IS NOT NULL)
AND 
year(purchase_date) = 2000 ;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...