MySQL 将多条记录分组或转换为 1 条记录
MySQL Grouping or converting multiple records into 1 single record
我有一个 MySQL Table 例如
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 是一个枚举并且将是常量
我们需要通过 branch
将每个日期的每个日期转换为单个记录
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 但该查询将班次时间与数据合并。我们希望在列 header 上。
也许我们需要使用 CASE WHEN。但我不确定。
您可以使用条件聚合来生成您想要的结果:
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
我有一个 MySQL Table 例如
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 是一个枚举并且将是常量 我们需要通过 branch
将每个日期的每个日期转换为单个记录 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 但该查询将班次时间与数据合并。我们希望在列 header 上。 也许我们需要使用 CASE WHEN。但我不确定。
您可以使用条件聚合来生成您想要的结果:
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