Конкретный вывод для cust_valid - PullRequest
1 голос
/ 01 июля 2019

Мне нужен клиент с cust_valid "A" и cust_valid "I" (2 строки на клиента).

select c.cust_first_name || ' ' || c.cust_last_name as customer_name,
c.cust_valid from customers c
join sales s on s.cust_id = c.cust_id
where c.cust_valid like '%A%' or
c.cust_valid like '%I%'
group by  c.cust_first_name, c.cust_last_name, c.cust_credit_limit, c.cust_valid
having sum(s.amount_sold) > c.cust_credit_limit * 500;

В качестве вывода у меня есть все клиенты, у которых есть либо A, либо I для cust_valid.Мне нужно вывести только клиентов, у которых есть оба (в 2 ряда)

Я пытался использовать AND вместо OR, но, поскольку ни в одной строке у нас не будет ни I, ни A, это даст мне пустую таблицу.

Ответы [ 3 ]

1 голос
/ 01 июля 2019

Используйте cte для вашего запроса и group by customer_name, чтобы вы получали только клиентов с A и I в cust_valid:

with cte as (
    select c.cust_first_name || ' ' || c.cust_last_name as customer_name,
    c.cust_valid from customers c
    join sales s on s.cust_id = c.cust_id 
    where c.cust_valid like '%A%' or c.cust_valid like '%I%'
    group by  c.cust_first_name, c.cust_last_name, c.cust_credit_limit, c.cust_valid
    having sum(s.amount_sold) > c.cust_credit_limit * 500
 )
select * from cte
where customer_name in (  
  select customer_name 
  from cte
  group by customer_name
  having count(distinct cust_valid) = 2
)
0 голосов
/ 01 июля 2019

Переместите чек в предложение HAVING и COUNT, чтобы убедиться, что у вас есть один из типов строк:

select c.cust_first_name || ' ' || c.cust_last_name as customer_name,
       LISTAGG( c.cust_valid, ',' ) WITHIN GROUP ( ORDER BY c.cust_valid ) AS cust_valid
from   customers c
       join sales s
       on s.cust_id = c.cust_id
WHERE  c.cust_valid like '%A%'
OR     c.cust_valid like '%I%'
group by  c.cust_first_name,
       c.cust_last_name,
       c.cust_credit_limit
having sum(s.amount_sold) > c.cust_credit_limit * 500
AND    COUNT( CASE WHEN c.cust_valid like '%A%' THEN 1 END ) > 0
AND    COUNT( CASE WHEN c.cust_valid like '%I%' THEN 1 END ) > 0;
0 голосов
/ 01 июля 2019

Вам нужно сделать SELF_JOIN, а также удалить CUST_VALID из GROUP BY, так как он отличается для того же клиента

SELECT
    C.CUST_FIRST_NAME
    || ' '
    || C.CUST_LAST_NAME AS CUSTOMER_NAME,
    LISTAGG(C.CUST_VALID,',') WITHIN GROUP (ORDER BY C.CUST_VALID) AS CUST_VALID
    -- CUST_VALID IS DIFFERENT FOR SAME CUSTOMERS SO LISTAGG IS USED TO GET ALL THE CUST_VALID
FROM
    CUSTOMERS C
    JOIN SALES S ON S.CUST_ID = C.CUST_ID
    JOIN CUSTOMERS C1 ON (C.<UNIQUE_KEYS> = C1.<UNIQUE_KEYS>)
WHERE
    C.CUST_VALID LIKE '%A%'
    AND C1.CUST_VALID LIKE '%I%' -- CONDTITION IS CHANGED TO C1
GROUP BY
    C.CUST_FIRST_NAME,
    C.CUST_LAST_NAME,
    C.CUST_CREDIT_LIMIT
    --C.CUST_VALID -- Removed it from GROUP BY
HAVING
    SUM(S.AMOUNT_SOLD) > C.CUST_CREDIT_LIMIT * 500;

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...