2015-10-27 4 views
0

Любые мысли о том, как написать это в SQL?Элементы списка SQL, купленные всеми

Список всех клиентов, которые купили продукты купленные любой другой

схеме является:

  • Customer (ИДС, CNAME)
  • Buys (TID, ИДС, ИДП)
  • Product (pId, pName)

Я пытаюсь выбрать все отдельные элементы и группировать таблицу. Покупает, используя это, но без везения.

+6

, что вы сделали до сих пор? – pedram

+4

И дб схема будет полезно ... – Tatiana

+1

Я пытался пересечь пункты, но без удачи – Dellein

ответ

2
-- Customers who bought products bought by every other customer 
SELECT DISTINCT cId,cName 
    FROM Customer c1 
     ,Buys b1 
WHERE c1.cId = b1.cId 
    AND pId IN 
-- Products bought by every other customer 
(SELECT pId 
    FROM (SELECT pId,COUNT(1) count_p 
      FROM (SELECT DISTINCT 
         cId,pId 
        FROM Buys) 
      GROUP BY pId) t1 
     ,(SELECT COUNT(1) count_c 
      FROM Customer) t2 
    WHERE t1.count_p = t2.count_c) 

Попробуйте вышеуказанный запрос и посмотрите, не работает ли он. У меня не было возможности проверить это.

1

Попробуйте это, испытайте на случайных данных, хорошо работает. Может быть медленными на большом объеме данных ..

SELECT cid, NAME 
    FROM (SELECT c.cid, c.name, cc.cnt, COUNT(b.pid) cpid 
      FROM customer c, buys b, product p, (SELECT COUNT(*) cnt FROM customer) cc 
     WHERE c.cid = b.cid 
      AND b.pid = p.pid 
     GROUP BY c.cid, c.name, cc.cnt) 
WHERE cpid = cnt 
1

Вы хотите получить список клиентов, которые имеют только купленных продуктов купленных каждый клиент. Поэтому я думаю, что вы должны помечать все продукты как SoldToAll или нет в подзапросе. Затем вы должны решить, если ваш клиент купил по крайней мере, один из продуктов, помеченных, как SoldToAll = 1, и ни один из продуктов, помеченных, как SoldToAll = 0.

-- Step 1. Flag products as SoldToAll 
SELECT 
    pid 
    ,CASE COUNT(*) = (SELECT COUNT(*) FROM Customer) THEN 1 ELSE 0 END AS SoldToAll 
FROM 
    (SELECT cid,pid 
    FROM buys 
    GROUP BY cid,pid 
    ) CustProd 
GROUP BY 
    pid 
-- Step 2. Use the above to get list 
;WITH Prod AS 
    (SELECT 
     pid 
     ,CASE COUNT(*) = (SELECT COUNT(*) FROM Customer) THEN 1 ELSE 0 END AS SoldToAll 
    FROM 
     (SELECT cid,pid 
     FROM buys 
     GROUP BY cid,pid 
     ) CustProd 
    GROUP BY 
     pid) 
SELECT 
    DISTINCT Buys.cid 
FROM 
    Buys 
WHERE 
    pid IN (SELECT pid FROM Prod WHERE SoldToAll = 1) 
EXCEPT 
SELECT 
    DISTINCT Buys.cid 
FROM 
    Buys 
WHERE 
    pid IN (SELECT pid FROM Prod WHERE SoldToAll = 0)