如何将单表记录转为其他表的列生成用户产品购销报表
需求可行性结论
该需求可实现,由于产品数量固定有限,采用条件聚合的写法即可快速实现,无需使用复杂的动态SQL。
实现逻辑
- 以users表作为主表,左关联bought、sold两张业务表,确保所有用户都能在报表中展示,无交易记录的用户对应字段可显示为0或NULL
- 针对每个固定产品,单独写条件聚合逻辑,通过CASE语句匹配对应产品ID,统计该用户对应产品的采购、销售总金额,按要求格式设置别名即可
- 若后续新增固定产品,只需对应新增聚合列即可,维护成本低
示例查询语句
假设当前products表固定有3个产品:ID=1对应产品名「电脑」、ID=2对应产品名「手机」、ID=3对应产品名「平板」,且bought、sold表的amount字段直接存储对应交易的总金额,示例代码如下:
SELECT u.id user_id, u.name user_name, -- 产品:电脑 SUM(CASE WHEN b.product_id = 1 THEN b.amount ELSE 0 END) bought_电脑, SUM(CASE WHEN s.product_id = 1 THEN s.amount ELSE 0 END) sold_电脑, -- 产品:手机 SUM(CASE WHEN b.product_id = 2 THEN b.amount ELSE 0 END) bought_手机, SUM(CASE WHEN s.product_id = 2 THEN s.amount ELSE 0 END) sold_手机, -- 产品:平板 SUM(CASE WHEN b.product_id = 3 THEN b.amount ELSE 0 END) bought_平板, SUM(CASE WHEN s.product_id = 3 THEN s.amount ELSE 0 END) sold_平板 FROM users u LEFT JOIN bought b ON u.id = b.user_id LEFT JOIN sold s ON u.id = s.user_id GROUP BY u.id, u.name ORDER BY u.id
调整说明
- 你可以根据实际产品列表,按照上述格式增减对应产品的聚合列即可
- 如果amount字段存储的是交易数量,需要计算金额时,可以额外关联products表取单价,将
b.amount调整为b.amount * p.price即可 - 若无交易记录需要显示为NULL而非0,删除CASE语句中的
ELSE 0即可
内容的提问来源于stack exchange,提问作者mehri abbasi
相关产品推荐
相关产品推荐

