CREATE TABLE operations (
id int auto_increment primary key,
campaign VARCHAR(255),
country VARCHAR(255),
sales_status VARCHAR(255),
quantity INT
);
INSERT INTO operations
(campaign, country, sales_status, quantity
)
VALUES
("C001", "DE", "demand", "100"),
("C001", "US", "shipped", "300"),
("C001", "NL", "shipped", "700"),
("C001", "FR", "shipped", "400"),
("C002", "DE", "demand", "500"),
("C002", "US", "demand", "900"),
("C002", "FR", "shipped", "200"),
("C003", "US", "demand", "600"),
("C003", "NL", "demand", "250"),
("C003", "FR", "demand", "150"),
("C003", "PL", "demand", "550"),
("C004", "DE", "shipped", "825"),
("C004", "PL", "shipped", "462");
预期结果:
campaign sales_status SUM(quantity)
C001 shipped 1500
C002 shipped 1600
C003 demand 1550
C004 shipped 1287
在上面的结果中,我希望每个广告系列sales_status
为shipped
,以防每个广告系列存在至少一个国家/地区,其中sales_status
是shipped
。
例如,在广告系列C002
中只有FR
是shipped
,因此结果C002
应该在shipped
中。
我尝试使用此查询:
SELECT
campaign,
(CASE WHEN MAX(sales_status = 'shipped') OVER (PARTITION BY campaign) = 1
THEN 'shipped' ELSE sales_status END) AS sales_status,
SUM(quantity)
FROM operations
GROUP BY 1;
但是,它不能给我正确的结果。
我需要进行哪些更改才能使其正常工作?
答案 0 :(得分:1)
为什么不简单
SELECT
campaign,
MAX(sales_status) AS sales_status,
SUM(quantity)
FROM operations
GROUP BY 1;
?
如果可能还有其他sales_status
值,则可以使用类似的
SELECT
campaign,
CASE WHEN SUM(sales_status = 'shipped')
THEN 'shipped'
ELSE 'demand'
END AS sales_status,
SUM(quantity)
FROM operations
GROUP BY 1;
答案 1 :(得分:0)
有条件聚合:
SELECT
campaign,
COALESCE(
MAX(CASE WHEN sales_status = 'shipped' THEN sales_status END),
MAX(sales_status)
) sales_status,
SUM(quantity) total
FROM operations
GROUP BY campaign;
或使用窗口功能FIRST_VALUE()
和SUM()
:
SELECT DISTINCT
campaign,
FIRST_VALUE(sales_status) OVER (PARTITION BY campaign ORDER BY sales_status = 'shipped' DESC) sales_status,
SUM(quantity) OVER (PARTITION BY campaign) total
FROM operations
请参见demo。
结果:
> campaign | sales_status | total
> :------- | :----------- | ----:
> C001 | shipped | 1500
> C002 | shipped | 1600
> C003 | demand | 1550
> C004 | shipped | 1287