Oracle Sql - выберите клиентов с более чем 1 заказом, перечисляя одну строку для каждого идентификатора повторяющегося столбца заказа - PullRequest
0 голосов
/ 17 мая 2019

Я новичок в SQL, и я пытаюсь несколькими способами решить что-то, что кажется простым, но безуспешно.

У меня есть две таблицы:

КЛИЕНТАМ

ID_ |   EMAIL
----+------------------- 
01  |   JOHN@GMAIL.COM
02  |   MARY@HOTMAIL.COM
03  |   PAUL@LIVE.COM

ЗАКАЗЫ

ID  |   ID_ORDER    |   SKU
----+---------------+------
01  |   0101        |   123
01  |   0101        |   456
01  |   0102        |   789
02  |   0201        |   124
02  |   0201        |   562
03  |   0301        |   896

Мне нужно составить список клиентов с более чем одним заказом, получающих ID столбцов, EMAIL и ID_ORDER. Моя последняя попытка была:

SELECT CUSTOMERS.ID_, CUSTOMERS.EMAIL, ORDERS.ID_ORDER
FROM CUSTOMERS
JOIN ORDERS ON CUSTOMERS.ID_ = ORDERS.ID
GROUP BY CUSTOMERS.ID_
HAVING COUNT(CUSTOMERS.ID_) > 1

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Сначала получите клиентов с более чем 1 заказами, сгруппировав их, а затем присоединитесь к таблицам:

SELECT DISTINCT 
  c.ID_, c.EMAIL, o.ID_ORDER
FROM (
  SELECT ID
  FROM ORDERS
  GROUP BY ID
  HAVING COUNT(DISTINCT ID_ORDER) > 1
) g 
INNER JOIN CUSTOMERS c ON c.ID_ = g.ID   
INNER JOIN ORDERS o ON o.ID = c.ID_

или

SELECT DISTINCT 
  c.ID_, c.EMAIL, o.ID_ORDER
FROM CUSTOMERS c INNER JOIN ORDERS o 
ON o.ID = c.ID_
WHERE c.ID_ IN (
  SELECT ID
  FROM ORDERS
  GROUP BY ID
  HAVING COUNT(DISTINCT ID_ORDER) > 1
)
0 голосов
/ 17 мая 2019

Если вы хотите, чтобы идентификаторы заказа были объединены в один ряд, вам нужно объединить их.В Oracle вы можете использовать listagg():

SELECT c.ID_, c.EMAIL, LISTAGG(o.ID_ORDER, ';') WITHIN GROUP (ORDER BY o.ID_ORDER) as id_orders
FROM CUSTOMERS c JOIN
     ORDERS o
     ON c.ID_ = o.ID
GROUP BY c.ID_, c.EMAIL
HAVING COUNT(*) > 1;

Чтобы получить их в разных строках, используйте оконные функции:

SELECT ID_, EMAIL, ID_ORDER
FROM (SELECT c.ID_, c.EMAIL, o.ID_ORDER,
             COUNT(*) OVER (PARTITION BY c_ID_) as cnt
      FROM CUSTOMERS c JOIN
           ORDERS o
           ON c.ID_ = o.ID
     ) c
WHERE cnt > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...