MySQL 有条件的 Group_Concat
MySQL Conditional Group_Concat
我需要有条件的帮助 group_concat。
我有一个 table,表 1,有四列 (id,day,class,results
)。我想按 id 和日期连接结果列,并按 class 将连接分成列,因此预期结果如下所示:
id | day | class1 | class2 | class3 | class4 | class5 | class6
1 | Monday | APPL<br>TSLA<br>BRK | NKE<br>GOOG<br>ARKK | etc etc
1 | Tuesday | AGEN<br>MSFT<br>SBUX | BCE<br>S&P<br>FB | etc etc
我正在努力解决如何实施 WHERE 子句的问题,因此我的结果目前忽略了 class(请参阅 fiddle)。我已经尝试了多个 WHERE 子句和 GROUP By 的不同组合,但无法弄清楚。
为了简单起见,这是我当前的代码,只有两个 class 列:
SELECT id,day, (select (concat_ws('<br>',group_concat(results SEPARATOR '<br>')))
group by id,day) as class1,
(select (concat_ws('<br>',group_concat(results SEPARATOR '<br>')))
group by id,day) as class2
from Table1
group by id,day
order by field(day,'monday','tuesday','wednesday','thursday','friday','saturday','sunday')
表 1 示例:
| id | day | class | results |
| --- | ------- | ----- | ------- |
| 1 | Monday | 1 | APPL |
| 1 | Monday | 1 | TSLA |
| 1 | Monday | 1 | BRK |
| 1 | Monday | 2 | NKE |
| 1 | Monday | 2 | GOOG |
| 1 | Monday | 2 | ARKK |
| 1 | Monday | 3 | AGEN |
| 1 | Monday | 3 | MSFT |
| 1 | Monday | 3 | SBUX |
| 1 | Monday | 3 | BCE |
| 1 | Tuesday | 1 | AGEN |
| 1 | Tuesday | 1 | MSFT |
| 1 | Tuesday | 1 | SBUX |
| 1 | Tuesday | 2 | BCE |
| 1 | Tuesday | 2 | S&P |
| 1 | Tuesday | 2 | FB |
Fiddle: https://www.db-fiddle.com/f/m1drVtHD1wzsrLHFLJ2Lu1/5
您需要条件聚合:
SELECT id, day,
GROUP_CONCAT(CASE WHEN class = 1 THEN results END SEPARATOR '<br>') class1,
GROUP_CONCAT(CASE WHEN class = 2 THEN results END SEPARATOR '<br>') class2,
GROUP_CONCAT(CASE WHEN class = 3 THEN results END SEPARATOR '<br>') class3,
GROUP_CONCAT(CASE WHEN class = 4 THEN results END SEPARATOR '<br>') class4,
GROUP_CONCAT(CASE WHEN class = 5 THEN results END SEPARATOR '<br>') class5,
GROUP_CONCAT(CASE WHEN class = 6 THEN results END SEPARATOR '<br>') class6
FROM Table1
GROUP BY id, day
ORDER BY FIELD(day,'monday','tuesday','wednesday','thursday','friday','saturday','sunday')
参见demo。
我需要有条件的帮助 group_concat。
我有一个 table,表 1,有四列 (id,day,class,results
)。我想按 id 和日期连接结果列,并按 class 将连接分成列,因此预期结果如下所示:
id | day | class1 | class2 | class3 | class4 | class5 | class6
1 | Monday | APPL<br>TSLA<br>BRK | NKE<br>GOOG<br>ARKK | etc etc
1 | Tuesday | AGEN<br>MSFT<br>SBUX | BCE<br>S&P<br>FB | etc etc
我正在努力解决如何实施 WHERE 子句的问题,因此我的结果目前忽略了 class(请参阅 fiddle)。我已经尝试了多个 WHERE 子句和 GROUP By 的不同组合,但无法弄清楚。
为了简单起见,这是我当前的代码,只有两个 class 列:
SELECT id,day, (select (concat_ws('<br>',group_concat(results SEPARATOR '<br>')))
group by id,day) as class1,
(select (concat_ws('<br>',group_concat(results SEPARATOR '<br>')))
group by id,day) as class2
from Table1
group by id,day
order by field(day,'monday','tuesday','wednesday','thursday','friday','saturday','sunday')
表 1 示例:
| id | day | class | results |
| --- | ------- | ----- | ------- |
| 1 | Monday | 1 | APPL |
| 1 | Monday | 1 | TSLA |
| 1 | Monday | 1 | BRK |
| 1 | Monday | 2 | NKE |
| 1 | Monday | 2 | GOOG |
| 1 | Monday | 2 | ARKK |
| 1 | Monday | 3 | AGEN |
| 1 | Monday | 3 | MSFT |
| 1 | Monday | 3 | SBUX |
| 1 | Monday | 3 | BCE |
| 1 | Tuesday | 1 | AGEN |
| 1 | Tuesday | 1 | MSFT |
| 1 | Tuesday | 1 | SBUX |
| 1 | Tuesday | 2 | BCE |
| 1 | Tuesday | 2 | S&P |
| 1 | Tuesday | 2 | FB |
Fiddle: https://www.db-fiddle.com/f/m1drVtHD1wzsrLHFLJ2Lu1/5
您需要条件聚合:
SELECT id, day,
GROUP_CONCAT(CASE WHEN class = 1 THEN results END SEPARATOR '<br>') class1,
GROUP_CONCAT(CASE WHEN class = 2 THEN results END SEPARATOR '<br>') class2,
GROUP_CONCAT(CASE WHEN class = 3 THEN results END SEPARATOR '<br>') class3,
GROUP_CONCAT(CASE WHEN class = 4 THEN results END SEPARATOR '<br>') class4,
GROUP_CONCAT(CASE WHEN class = 5 THEN results END SEPARATOR '<br>') class5,
GROUP_CONCAT(CASE WHEN class = 6 THEN results END SEPARATOR '<br>') class6
FROM Table1
GROUP BY id, day
ORDER BY FIELD(day,'monday','tuesday','wednesday','thursday','friday','saturday','sunday')
参见demo。