Mysql 如果每个值至少满足一个标准,则为所有其他值指定一个特定值
Mysql 如果每个值至少满足一个标准,则为所有其他值指定一个特定值,mysql,sql,window-functions,Mysql,Sql,Window Functions,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 (&qu
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\u状态
为shipped
,以防每个活动中至少有一个国家的sales\u状态
为shipped
例如,在活动
C002
中,只有FR
已装运,因此在结果中C002
应在已装运
中
我尝试使用此查询:
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;
然而,它并没有给我正确的结果我需要改变什么才能让它工作?为什么不简单
SELECT
campaign,
MAX(sales_status) AS sales_status,
SUM(quantity)
FROM operations
GROUP BY 1;
?
如果可能存在另一个sales\u status
值,您可以使用
SELECT
campaign,
CASE WHEN SUM(sales_status = 'shipped')
THEN 'shipped'
ELSE 'demand'
END AS sales_status,
SUM(quantity)
FROM operations
GROUP BY 1;
使用条件聚合:
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\u VALUE()
和SUM()
:
请参阅。结果:
您的代码对于您希望实现的目标来说似乎过于复杂。
OVER(按活动划分)
毫无意义-您已经有了此列的分组依据。所以MAX()的聚合版本就足够了。
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
> campaign | sales_status | total
> :------- | :----------- | ----:
> C001 | shipped | 1500
> C002 | shipped | 1600
> C003 | demand | 1550
> C004 | shipped | 1287