mysql行转列sql函数_Mysql-sql行转列

原始数据如下图所示:(商品的销售明细)

date=业务日期;Item=商品名称;saleqty=销售数量

10f717cbafc895ea6e91200e9eb26aca.png

-- 建立测试数据(表)

create table test (Date varchar(10), item char(10),saleqty int);

insert test values('2010-01-01','AAA',8);

insert test values('2010-01-02','AAA',4);

insert test values('2010-01-03','AAA',5);

insert test values('2010-01-01','BBB',1);

insert test values('2010-01-02','CCC',2);

insert test values('2010-01-03','DDD',6);

实现的方法和思路如下:两个方法

-- 实现结果的静态SQL语句写法-- 整理报表需要的格式

方法一:case item when x then xx when y then yy end

select date,

case item when 'AAA' then saleqty end as AAA,

case item when 'BBB' then saleqty end as BBB,

case item when 'CCC' then saleqty end as CCC,

case item when 'DDD' then saleqty end as DDD

from test;

方法二:if(条件判断,成立结果,不成立结果)

select date,

if (item = 'AAA',saleqty,null) as AAA,

if (item = 'BBB',saleqty,null) as BBB,

if (item = 'CCC',saleqty,null) as CCC,

if (item = 'DDD',saleqty,null) as DDD

from test;

0d9f2370ac6ad39e78c4f7dd2b3e5bc2.png

-- 按日期汇总行

select date,

sum(case item when 'AAA' then saleqty end)as AAA,

sum(case item when 'BBB' then saleqty end)as BBB,

sum(case item when 'CCC' then saleqty end)as CCC,

sum(case item when 'DDD' then saleqty end)as DDD

from test group by date;

select date,

sum(if (item = 'AAA',saleqty,null)) as AAA,

sum(if (item = 'BBB',saleqty,null)) as BBB,

sum(if (item = 'CCC',saleqty,null)) as CCC,

sum(if (item = 'DDD',saleqty,null)) as DDD

from test group by date;

2b9461b611ec38ec1b3f324045ec1e1e.png

-- 处理数据:将空值的栏位填入数字0;

select date,

ifnull(sum(case item when 'AAA' then saleqty end) ,0)as AAA,

ifnull(sum(case item when 'BBB' then saleqty end) ,0)as BBB,

ifnull(sum(case item when 'CCC' then saleqty end) ,0)as CCC,

ifnull(sum(case item when 'DDD' then saleqty end) ,0)as DDD

from test group by date;

select date,

ifnull(sum(if (item = 'AAA',saleqty,null)),0) as AAA,

ifnull(sum(if (item = 'BBB',saleqty,null)),0) as BBB,

ifnull(sum(if (item = 'CCC',saleqty,null)),0) as CCC,

ifnull(sum(if (item = 'DDD',saleqty,null)),0) as DDD

from test group by date;

dab791b9b977fd37a849d0226bfaccc1.png

静态SQL语句编写完成!

其实有一步骤有点多余:可以直接if(,,0),而不是if(,,null)

select date,

if (item = 'AAA',saleqty,0) as AAA,

if (item = 'BBB',saleqty,0) as BBB,

if (item = 'CCC',saleqty,0) as CCC,

if (item = 'DDD',saleqty,0) as DDD

from test;

342db2792600f1feab0335e57f77311b.png

select date,

sum(if (item = 'AAA',saleqty,0)) as AAA,

sum(if (item = 'BBB',saleqty,0)) as BBB,

sum(if (item = 'CCC',saleqty,0)) as CCC,

sum(if (item = 'DDD',saleqty,0)) as DDD

from test group by date;

01c57bf5de4230e5a5a491cde6398b78.png

静态SQL语句编写完成!

参考网址https://www.cnblogs.com/ShaYeBlog/p/3594517.html

================================================================================================================

三月的时候就遇到了行转列。

计算一个表中的字段被清洗和标准化被命中的比例和原因。

转成行输出。

979a8bc8e922fdc02262742b191aef72.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,行转列可以使用多种方法实现。以下是两种常用的方法: 方法1:使用GROUP_CONCAT函数 ```sql SELECT id, name, GROUP_CONCAT(CASE WHEN subject = '语文' THEN score END SEPARATOR '') AS '语文', GROUP_CONCAT(CASE WHEN subject = '数学' THEN score END SEPARATOR '') AS '数学', GROUP_CONCAT(CASE WHEN subject = '英语' THEN score END SEPARATOR '') AS '英语' FROM test1 GROUP BY name; ``` 在这个方法中,通过使用GROUP_CONCAT函数将每个科目分数连接成一个字符串,并使用CASE语句将对应科目的分数筛选出来。 方法2:使用SUM和IF函数 ```sql SELECT id, name, SUM(IF(subject = '语文',score,0)) AS '语文', SUM(IF(subject = '数学',score,0)) AS '数学', SUM(IF(subject = '英语',score,0)) AS '英语' FROM test1 GROUP BY name; ``` 在这个方法中,使用IF函数对每个科目的分数进行条件判断,如果科目匹配,则返回分数,否则返回0。然后使用SUM函数将每个科目的分数进行求和。 以上就是实现MySQL行转列的两种常用方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL行转列、列转行](https://blog.csdn.net/w5761499123/article/details/126211094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值