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

再将所有数据合并一下


即达到了我们需要的效果


猜你喜欢

转载自blog.csdn.net/yijianqingyu/article/details/80105390
今日推荐