MySQL语句求助
有一张工资表,怎么查询改员工每年各个月的工资收入呢?不太会设计数据表,如果字段设计的不好,麻烦大佬教下怎么设计更好的查询
第一张图是表中现有的数据和设计好的字段
第二张图使用的语句是:select name,group_concat(shouru) from table group by name;
该怎样查询可以得出第二张图右边的结果?
先感谢各位大佬!{:301_993:}
有大佬解答吗{:301_990:} comcn 发表于 2022-6-27 08:38
有大佬解答吗
group by year, month 显示结果是一行记录显示一个月的工资,你想要的结果在一行记录显示所有,可能使用列转行的思路 springandme 发表于 2022-6-27 08:59
group by year, month 显示结果是一行记录显示一个月的工资,你想要的结果在一行记录显示所有,可能使用 ...
可能是行转列用法,我一会到公司试试sql写法 3楼说的对,就是行转列用法
SELECT NAME,
MAX( CASE WHEN date_month = '5' THEN shouru ELSE 0 END ) AS "5",
MAX( CASE WHEN date_month = '6' THEN shouru ELSE 0 END ) AS "6",
MAX( CASE WHEN date_month = '7' THEN shouru ELSE 0 END ) AS "7"
FROM
table
GROUP BY
NAME SpeII 发表于 2022-6-27 11:15
3楼说的对,就是行转列用法
SELECT NAME,
MAX( CASE WHEN date_month = '5' THEN ...
感谢,语句可以运行,在这个基础上可以优化下吗,2-4行,比如工资有12个月的。除了写12行sql语句,还有简洁的吗 本帖最后由 SpeII 于 2022-6-27 14:41 编辑
comcn 发表于 2022-6-27 11:45
感谢,语句可以运行,在这个基础上可以优化下吗,2-4行,比如工资有12个月的。除了写12行sql语句,还有简 ...
写成了存储过程,你试试
DROP PROCEDURE
IF EXISTS sp_salary;
DELIMITER &&
CREATE PROCEDURE sp_salary ()
BEGIN
DECLARE
date_month_n VARCHAR (20) ;
DECLARE
count INT ;
DECLARE
i INT DEFAULT 0 ;
SET @s = 'SELECT NAME' ;
SET count = (
SELECT
COUNT(DISTINCT shouru)
FROM
tablename
) ;
WHILE i < count DO
SET date_month_n = (
SELECT
date_month
FROM
tablename
GROUP BY date_month
LIMIT i,
1
) ;
SET @s = CONCAT(
@s,
', MAX(CASE date_month WHEN ',
'\'',
date_month_n,
'\'',
' THEN shouru ELSE 0 END)',
' AS ',
'\'',
date_month_n,
'\''
) ;
SET i = i + 1 ;
END
WHILE ;
SET @s = CONCAT(
@s,
' FROM tablename GROUP BY name'
) ;
#SELECT @s;
PREPARE stmt
FROM
@s ; EXECUTE stmt ;
END&&
CALL sp_salary(); SpeII 发表于 2022-6-27 14:39
写成了存储过程,你试试
DROP PROCEDURE
IF EXISTS sp_salary;
好的,非常感谢
页:
[1]