mysql之行列转换

目的:实现行列转换功能

需求:导出成如下图的Excel


数据:数据库格式如下图


除报销表外还涉及到用户表、部门表、等许多从表

我们需要将数据进行筛选(报销成功的),合并,行列转换

1.筛选并合并

SELECT su.name AS "id",ed.cost_type,ed.cost_description,sum(ed.amount_money)
FROM expense_detail ed 
LEFT JOIN get_sale gs ON ed.sale_detail_id = gs.sale_detail_id
LEFT JOIN sys_user su ON su.id = gs.user_id 
WHERE gs.del_flag = "0" AND gs.statu = "审核通过"
GROUP BY ed.cost_description,su.id

2.行列转换。查询出想要的数据了,之后将其行列对调

SELECT su.id AS "id", 
	sum(case ed.cost_description when "办公用品" then amount_money else 0 end) AS 'oneExpenseOne',
	sum(case ed.cost_description when "低值易耗品" then amount_money else 0 end) AS 'oneExpenseTwo',
	sum(case ed.cost_description when "图书资料费" then amount_money else 0 end) AS 'oneExpenseThree',
	sum(case ed.cost_description when "快递费" then amount_money else 0 end) AS 'oneExpenseFour',
	sum(case ed.cost_description when "饮用水" then amount_money else 0 end) AS 'oneExpenseFive',
	sum(case ed.cost_description when "其他办公费用" then amount_money else 0 end) AS 'oneExpenseSix',

FROM expense_detail ed 
LEFT JOIN get_sale gs on ed.sale_detail_id = gs.sale_detail_id
LEFT JOIN sys_user su on su.id = gs.user_id 
WHERE gs.del_flag = "0" and gs.statu = "审核通过"
GROUP BY ed.cost_description,su.id


可以看出这样行列转换后有一个问题,那就是每个人的每一类报销单独占一行,而我们应该讲每个人的所有报销放在一条数据中

3.归并

SELECT t.id AS "getSaleUser.id",
	sum(oneExpenseOne) AS "oneExpenseOne",
	sum(oneExpenseTwo) AS "oneExpenseTwo",
	sum(oneExpenseThree) AS "oneExpenseThree",
	sum(oneExpenseFour) AS "oneExpenseFour",
	sum(oneExpenseFive) AS "oneExpenseFive",
	sum(oneExpenseSix) AS "oneExpenseSix",	
FROM(		
SELECT su.id AS "id", 
	sum(case ed.cost_description when "办公用品" then amount_money else 0 end) AS 'oneExpenseOne',
	sum(case ed.cost_description when "低值易耗品" then amount_money else 0 end) AS 'oneExpenseTwo',
	sum(case ed.cost_description when "图书资料费" then amount_money else 0 end) AS 'oneExpenseThree',
	sum(case ed.cost_description when "快递费" then amount_money else 0 end) AS 'oneExpenseFour',
	sum(case ed.cost_description when "饮用水" then amount_money else 0 end) AS 'oneExpenseFive',
	sum(case ed.cost_description when "其他办公费用" then amount_money else 0 end) AS 'oneExpenseSix',
		
FROM expense_detail ed 
LEFT JOIN get_sale gs on ed.sale_detail_id = gs.sale_detail_id
LEFT JOIN sys_user su on su.id = gs.user_id 
WHERE gs.del_flag = "0" and gs.statu = "审核通过"
GROUP BY ed.cost_description,su.id) t
GROUP BY t.id

再将所有数据合并一下


即达到了我们需要的效果


  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值