吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 619|回复: 7
收起左侧

[求助] MySQL语句求助

[复制链接]
comcn 发表于 2022-6-25 14:35
有一张工资表,怎么查询改员工每年各个月的工资收入呢?
不太会设计数据表,如果字段设计的不好,麻烦大佬教下怎么设计更好的查询


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


该怎样查询可以得出第二张图右边的结果?
先感谢各位大佬!
微信截图_20220625143049.png
QQ截图20220625143023.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| comcn 发表于 2022-6-27 08:38
有大佬解答吗
springandme 发表于 2022-6-27 08:59

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楼说的对,就是行转列用法
[SQL] 纯文本查看 复制代码
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楼说的对,就是行转列用法
[mw_shl_code=sql,true]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语句,还有简 ...

写成了存储过程,你试试
[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
写成了存储过程,你试试
[mw_shl_code=sql,true]DROP PROCEDURE
IF EXISTS sp_salary;

好的,非常感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 02:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表