comcn 发表于 2022-6-25 14:35

MySQL语句求助

有一张工资表,怎么查询改员工每年各个月的工资收入呢?
不太会设计数据表,如果字段设计的不好,麻烦大佬教下怎么设计更好的查询


第一张图是表中现有的数据和设计好的字段
第二张图使用的语句是:select name,group_concat(shouru) from table group by name;


该怎样查询可以得出第二张图右边的结果?
先感谢各位大佬!{:301_993:}

comcn 发表于 2022-6-27 08:38

有大佬解答吗{:301_990:}

springandme 发表于 2022-6-27 08:59

comcn 发表于 2022-6-27 08:38
有大佬解答吗

group by year, month 显示结果是一行记录显示一个月的工资,你想要的结果在一行记录显示所有,可能使用列转行的思路

springandme 发表于 2022-6-27 09:03

springandme 发表于 2022-6-27 08:59
group by year, month 显示结果是一行记录显示一个月的工资,你想要的结果在一行记录显示所有,可能使用 ...

可能是行转列用法,我一会到公司试试sql写法

SpeII 发表于 2022-6-27 11:15

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

comcn 发表于 2022-6-27 11:45

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:39

本帖最后由 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();

comcn 发表于 2022-6-27 14:55

SpeII 发表于 2022-6-27 14:39
写成了存储过程,你试试
DROP PROCEDURE
IF EXISTS sp_salary;


好的,非常感谢
页: [1]
查看完整版本: MySQL语句求助