2017-02-02 2 views
0

Мне нужно выяснить, сколько карандашей было куплено на сумму 2017-01-01 людьми, которые купили один другой тип товара до покупки карандаши. (например, купленные только записные книжки) Это то, что у меня есть, что пока показывает много, кто купил один тип продукта заранее, так что мне не хватает, сколько карандашей они купили на 2017-01-01:SQL - Выбор клиента, который купил только 1 тип продукта в определенную дату

SELECT 
c.name, 
s.units_sold AS Sold, 
s.product_id 

FROM 
sales AS s 
INNER JOIN customers AS c 
ON c.id=s.customer_id 
GROUP BY c.name 
HAVING COUNT(DISTINCT s.product_id) = 1 

Я попытался найти похожие вопросы без успеха. Надеюсь, что мой вопрос ясен:/

Спасибо!

+3

Вы должны показать данные образца или, по крайней мере, образец данных. Желательные результаты также полезны. Важная информация, такая как поле даты и название продукта, отсутствует. –

ответ

1

Это похоже на очень странный вопрос. Но если бы я прочитал буквально, то, казалось бы, хочу что-то вроде этого:

select sum(s.units_sold) 
from sales s 
where s.product_id = 'pencil' and 
     s.date = '2017-01-01' and 
     1 = (select count(distinct s2.product_id) 
      from sales s2 
      where s2.customer_id = s.customer_id and 
       s2.date < s.date 
     ); 
+0

Не только вы поняли мой вопрос, вы прибили его! Огромное спасибо. Мне пришлось поиграть с ним, потому что мне нужно было что-то немного другое, но это действительно помогло! Спасибо, Гордон! –

0

запроса Гордона законен, хотя, кажется, есть недостаток: он будет выполнение подзапроса стольких раз, как количество клиенты. Это тяжело.

Просто помните, что SQL является декларативным языком, поэтому вы не укажете движку, как он должен это делать - просто объявите, что вам нужно.

Таким образом, можно было бы подумать по дороге, как:

  1. мне нужно запустить свой совокупный запрос на подмножества клиентов.
  2. Итак, я собираюсь сначала определить это подмножество: те, у кого была только одна покупка; любого другого продукта, который является карандашом; до данной даты
  3. Как только у меня есть этот набор клиентов, я могу обратиться к их покупкам: точно карандаши; (!) Именно на данную дату

Здесь, в первой итерации, ваш запрос становится довольно очевидно (я буду использовать обозначения Гордона):

SELECT sum(s.units_sold) 
FROM sales s 
WHERE s.product_id = 'pencil' AND 
     s.date = '2017-01-01' AND 
     s.customer_id IN (
      SELECT s2.customer_id 
      FROM sales s2 
      WHERE s2.date < '2017-01-01' 
      GROUP BY s2.customer_id 
      HAVING count(DISTINCT s2.product_id) = 1 
    ); 

Я действительно не проверил это, но Надеюсь, у вас появилась идея - в этом случае она сводится к двухпроходной: одна для получения подмножества клиентов, отвечающих заданным критериям, во-вторых, чтобы агрегировать их операции, которые соответствуют заданным условиям.

Смежные вопросы