MySQL技术需求:按name分组生成kodemat列头展示交易数据
MySQL分组并生成多列kodemat查询问题
数据表结构
1. tblcustomer表
| id | datecreated | custname |
|---|---|---|
| 1 | 2022-12-01 | tom |
| 2 | 2022-12-01 | john |
| 3 | 2022-12-02 | john |
| 4 | 2022-12-01 | carles |
| 5 | 2022-12-01 | diki |
2. tbltransaction表
| id | custID | name | qty | kodemat |
|---|---|---|---|---|
| 1 | 1 | abc | 10 | 2201 |
| 2 | 1 | ab | 10 | 2201 |
| 3 | 1 | aa | 10 | 2202 |
| 4 | 2 | ab | 5 | 2202 |
| 5 | 2 | ac | 5 | 2203 |
| 6 | 1 | ac | 20 | 2204 |
预期查询结果
按name分组,生成kodemat 1、kodemat 2、kodemat 3列头并统计sumqty:
| datecreated | name | kodemat 1 | kodemat 2 | kodemat 3 | sumqty |
|---|---|---|---|---|---|
| 2022-12-01 | abc | 2201 | 0 | 0 | 10 |
| 2022-12-01 | ab | 2201 | 2202 | 0 | 15 |
| 2022-12-01 | aa | 2202 | 0 | 0 | 10 |
| 2022-12-01 | ac | 2203 | 2204 | 0 | 25 |
当前查询语句及问题
当前使用的SQL语句:
SELECT a.id,a.name,group_concat(a.kodemat order by a.id limit 5 ) kodemat, sum(a.qty) qty, datecreated,custname from tbltransaction a join tblcustomer b on b.id = a.custID where a.qty >'0' group by a.name;
查询结果(不符合预期,kodemat为拼接字符串而非分列展示):
| datecreated | name | kodemat | sum qty |
|---|---|---|---|
| 2022-12-01 | abc | 2201 0 0 | 10 |
| 2022-12-01 | ab | 2201 ,2202 , 0 | 15 |
| 2022-12-01 | aa | 2202 ,0 , 0 | 10 |
| 2022-12-01 | ac | 2203 ,2204 , 0 | 25 |
解决方案SQL语句
SELECT b.datecreated, t.name, MAX(CASE WHEN t.rn = 1 THEN t.kodemat ELSE 0 END) AS `kodemat 1`, MAX(CASE WHEN t.rn = 2 THEN t.kodemat ELSE 0 END) AS `kodemat 2`, MAX(CASE WHEN t.rn = 3 THEN t.kodemat ELSE 0 END) AS `kodemat 3`, SUM(t.qty) AS sumqty FROM ( SELECT custID, name, qty, kodemat, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rn FROM tbltransaction WHERE qty > 0 ) t JOIN tblcustomer b ON b.id = t.custID GROUP BY t.name, b.datecreated ORDER BY t.name DESC;
逻辑说明
- 子查询中通过
ROW_NUMBER()窗口函数,按name分组、id排序,给每个分组内的kodemat生成顺序序号。 - 外层查询用
CASE结合MAX聚合函数,提取序号1、2、3对应的kodemat,无对应值时填充0。 - 同时聚合计算
sumqty,关联tblcustomer获取datecreated,最终按name分组得到符合预期的分列结果。
内容的提问来源于stack exchange,提问作者den.bagoes
相关产品推荐
相关产品推荐

