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
条件如何才能达到预期的结果。
你有什么主意吗?
答案 0 :(得分:0)
这将为您提供在不同过程状态下投放类型不同的所有广告系列:
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
答案 2 :(得分:0)
/* 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;