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