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

mysql之行列转换_第1张图片

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

mysql之行列转换_第2张图片

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

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

再将所有数据合并一下

mysql之行列转换_第3张图片

即达到了我们需要的效果


你可能感兴趣的:(mysql)