СЛЕВА СОЕДИНИТЬ две таблицы с несколькими условиями AND - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужна помощь для правильного получения выписки sql путем объединения двух таблиц.

enter image description here

Моя цель - вернуть количество покупок между определенными датами покупкидля заданных продуктов, где customer_id равно нулю.Внешний ключ для таблицы Purchases равен prospect_id, что соответствует id в Prospect

В отдельных инструкциях SQL у меня будет следующее:

SELECT COUNT (id) FROM Purchases 
WHERE (purchasedate BETWEEN '5/1/18' AND '12/31/18')
AND (product = 'Scooter')

SELECT id
from Prospect
where customer_id is null

Итак, явозникает запрос вроде этого:

SELECT COUNT (id)
FROM Purchases
LEFT JOIN Prospect 
ON Prospect.id = Purchases.prospect_id
AND (Purchases.purchasedate BETWEEN '5/1/18' AND '12/31/18')
AND Purchases.product = 'Scooter'
AND Prospect.customer_id is null;

, но затем я получаю ОШИБКУ: ссылка на столбец "id" является неоднозначной.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

причина вашей ошибки в том, что вы не определили, из какой таблицы идет поле "id", из которого вы хотите сосчитать.

SELECT 
COUNT(PURCHASES.ID) AS PURCHASE_COUNT
FROM 
Purchases 
LEFT JOIN Prospect 
ON Prospect.id = Purchases.prospect_id
AND (Purchases.purchasedate BETWEEN '5/1/18' AND '12/31/18')
AND Purchases.product = 'Scooter'
AND Prospect.customer_id is null;
2 голосов
/ 18 апреля 2019

Использование count(*):

SELECT COUNT(*)
FROM Purchases pu LEFT JOIN
     Prospect pr
     ON pr.id = pu.prospect_id AND
        pr.customer_id is null
WHERE pu.purchasedate >= '2018-05-01' AND
      pu.purchasedate < '2019-01-01' AND
      pu.product = 'Scooter';

Я внес несколько изменений в запрос.

Во-первых, условия для purchase содержатся в предложении where, а не в предложении on. Предположительно, вы действительно хотите, чтобы это были фильтры.

Во-вторых, даты используют правильный формат, ГГГГ-ММ-ДД.

Я также заменил between на явные сравнения. Это означает, что код работает, даже если столбец «date» имеет компонент времени.

Наконец, я также ввел псевдонимы таблиц.

...