Проверьте, не являются ли значения в одном столбце уникальными на основе значений в другом столбце - PullRequest
2 голосов
/ 06 мая 2020

DB-Fiddle

CREATE TABLE logistics (
    id int auto_increment primary key,
    campaign VARCHAR(255),
    process_status VARCHAR(255),
    delivery_type VARCHAR(255),
    quantity INT
);

INSERT INTO logistics
(campaign, process_status, delivery_type, quantity
)
VALUES 
("C001", "offer", "fedex", "500"),
("C001", "offer", "fedex", "200"),
("C001", "order", "ubs", "400"),
("C001", "shipped", "ubs", "100"),

("C002", "offer", "fedex", "800"),
("C002", "offer", "fedex", "100"),
("C002", "order", "fedex", "650"),
("C002", "shipped", "fedex", "250"),

("C003", "offer", "fedex", "730"),
("C003", "order", "fedex", "620"),
("C003", "shipped", "dhl", "530"),

("C004", "order", "fedex", "200"),
("C004", "shipped", "fedex", "130"),

("C005", "order", "fedex", "900"),
("C005", "shipped", "ubs", "475"),

("C006", "order", "fedex", "635");

Ожидаемый результат

campaign      process_status       delivery_type      quantity
C001          offer                fedex              700
C001          order                ubs                400
C001          shipped              ubs                100
C003          offer                fedex              730
C003          order                fedex              620        
C003          shipped              dhl                530
C005          offer                fedex              900
C005          shipped              ubs                475

В приведенном выше Таблица у меня разные campaigns, свои process_status и delivery_type.
Теперь я хочу извлечь все campaigns, которые переключают свои delivery_type между разными process_status.

Поэтому я ищу запрос, который делает что-то вроде этого:

SELECT
campaign,
process_status,
delivery_type,
quantity
FROM logistics
WHERE delivery_type differes in different process_status

Я понятия не имею, как должно выглядеть условие WHERE для достижения ожидаемого результата.
Есть идеи?

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Вы можете попробовать следующий запрос.

SELECT 
campaign, process_status, delivery_type, sum(quantity) as quantity
FROM logistics
WHERE campaign IN (
    SELECT
    campaign
    FROM logistics
    GROUP BY campaign
    HAVING max(delivery_type)!=min(delivery_type)
)
GROUP BY campaign, process_status, delivery_type

Проверить демо здесь

0 голосов
/ 06 мая 2020

DB-Fiddle

/* Match all values to campaigns that fullfill condition */
SELECT
l2.campaign,
l2.process_status,
l2.delivery_type,
SUM(l2.quantity)
from logistics l2
JOIN

  /* Get campaigns that fullfill condition */
   (SELECT
   t1.campaign,
   t1.process_status,
   t1.delivery_type,
   t1.count_process_status,
   t1.count_delivery_status
   FROM

     /* Count process_status and delivery_status */
     (SELECT
     l.campaign,
     l.process_status,
     l.delivery_type,
     COUNT(DISTINCT l.process_status) as count_process_status,
     COUNT(DISTINCT l.delivery_type) as count_delivery_status,
     SUM(l.quantity)
     FROM logistics l
     GROUP BY 1) t1

    WHERE count_delivery_status > 1) t2 ON l2.campaign = t2.campaign

GROUP BY 1,2,3;
0 голосов
/ 06 мая 2020

enter image description here

Это предоставит вам все кампании, в которых тип доставки отличается в разных состояниях процесса:

SELECT (campaign),count(1) AS cnt
FROM logistics
GROUP BY campaign,
         delivery_type
HAVING cnt>1;

Вы можете добавить отдельные, если хотите уникальные значения кампании:

SELECT distinct(campaign),
       count(1) AS cnt
FROM logistics
GROUP BY campaign,
         delivery_type
HAVING cnt>1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...