MySQL将多个记录分组或转换为1个单个记录

问题描述 投票:0回答:1

例如,我有一个MySQL

  Date    | Branch | shift_time | Total Order | Avg Price
20-06-08  | A      | morning    | 4           | 5.6
20-06-08  | A      | night      | 3           | 3.4
20-06-08  | B      | morning    | 2           | 2.7
20-06-08  | B      | night      | 6           | 5.9 
20-06-09  | A      | morning    | 9           | 8.9 
20-06-09  | A      | night      | 4           | 6.9

shift_time是一个枚举,将保持不变我们需要在每个日期按分支将其转换为单个记录

  Date    | Branch | morning_total_order | morning_price | night_total_order | night_avg_price 
20-06-08  | A      | 4                   | 5.6           | 3                 | 3.4
20-06-08  | B      | 2                   | 2.7           | 6                 | 5.9
20-06-09  | A      | 9                   | 8.9           | 4                 | 6.9

我尝试使用GROUP_CONCAT,但是该查询将轮班时间与数据合并。我们想要在列标题上。也许我们需要使用CASE WHEN。但是我不确定。

mysql sql select concat group-concat
1个回答
0
投票

您可以使用条件聚合来生成所需的结果:

SELECT Date, Branch,
       SUM(CASE WHEN shift_time = 'morning' THEN `Total Order` ELSE 0 END) AS morning_total_order,
       SUM(CASE WHEN shift_time = 'morning' THEN `Avg Price` * `Total Order` ELSE 0 END) /
       SUM(CASE WHEN shift_time = 'morning' THEN `Total Order` ELSE 0 END) AS morning_avg_price,
       SUM(CASE WHEN shift_time = 'night' THEN `Total Order` ELSE 0 END) AS night_total_order,
       SUM(CASE WHEN shift_time = 'night' THEN `Avg Price` * `Total Order` ELSE 0 END) /
       SUM(CASE WHEN shift_time = 'night' THEN `Total Order` ELSE 0 END) AS night_avg_price
FROM shifts
GROUP BY Date, Branch

输出:

Date        Branch  morning_total_order     morning_avg_price   night_total_order   night_avg_price
20-06-08    A       4                       5.6                 3                   3.4
20-06-08    B       2                       2.7                 6                   5.9
20-06-09    A       9                       8.9                 4                   6.9

Demo on SQLFiddle

© www.soinside.com 2019 - 2024. All rights reserved.