根据另一列中的值检查一列中的值是否唯一

时间:2020-05-06 07:38:05

标签: mysql sql

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_statusdelivery_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 :(得分:0)

enter image description here

这将为您提供在不同过程状态下投放类型不同的所有广告系列:

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

如果您想要唯一的广告系列值,则可以添加“ distinct”:

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

答案 1 :(得分:0)

您可以尝试以下查询。

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

shooting method

答案 2 :(得分:0)

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;