【最全最经典SQL题】一 行列转换

本文介绍了如何使用SQL解决数据开发中的行转列和列转行问题,以门店销售数据为例,通过示例和创建表结构展示了如何在MySQL中实现这两种操作,鼓励读者实践并交流不同的实现方法。
摘要由CSDN通过智能技术生成

一、前言

从事数仓,数据开发的同学应该知道,日常工作中主要要用到SQL去实现业务各种数据需求。本系列【最全最经典SQL题】将列举日常工作或者笔试面试中频繁、经典的业务场景并通过SQL去实现。欢迎大家收藏起来,遇到对应的场景可以马上用起来。本系列不定期更新,内容如下:

【最全最经典SQL题】一 行列转换

【最全最经典SQL题】二 排名取它值

【最全最经典SQL题】三 累计求值

【最全最经典SQL题】四 窗口大小控制

【最全最经典SQL题】五 数据合并与拆分

【最全最经典SQL题】六 数据扩充与收缩

【最全最经典SQL题】七 容器

【最全最经典SQL题】八 时间序列

【最全最经典SQL题】九 非等值连接

更新中........

本系列将提供建表语句、数据、解题SQL代码,大家动动小手指就能看到效果以便理解,为了方便大部分同学实操,默认采用MySQL的SQL,如Hive有区别的会注明一下。


二、表结构

现有一张门店销售统计日表,具体字段和注释如下:

CREATE TABLE `st_store_sales_di` (
  `stat_date` date NOT NULL COMMENT '日期',
  `store_id` int NOT NULL  COMMENT '门店ID',
  `store_name` varchar(10) COMMENT '门店名称',
  `sales_amt` decimal(38,2)  COMMENT '销售金额'
) ENGINE=InnoDB COMMENT='门店销售统计日表';

三、数据准备

先准备3家门店,5天的数据

INSERT INTO `st_store_sales_di` VALUES ('2024-03-01', 1001, '广州店', 380.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-01', 1002, '北京店', 220.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-01', 1003, '上海店', 360.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-02', 1001, '广州店', 350.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-02', 1002, '北京店', 380.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-02', 1003, '上海店', 180.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-03', 1001, '广州店', 260.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-03', 1002, '北京店', 280.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-03', 1003, '上海店', 230.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-04', 1001, '广州店', 310.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-04', 1002, '北京店', 290.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-04', 1003, '上海店', 420.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-05', 1001, '广州店', 460.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-05', 1002, '北京店', 490.00);
INSERT INTO `st_store_sales_di` VALUES ('2024-03-05', 1003, '上海店', 480.00);

四、数据需求

1、行转列

现在的数据展示如下:

现有需求:将各门店分别按列展示销售数据,最终效果如下:

 SQL实现

select stat_date
       ,max(case when store_name = "广州店" then sales_amt end) as 广州店 
	   ,max(case when store_name = "北京店" then sales_amt end) as 北京店
	   ,max(case when store_name = "上海店" then sales_amt end) as 上海店 
  from st_store_sales_di
 group by stat_date

2、列转行

就是将上面的结果表再转回去

数据准备如下:

drop table if exists st_store_sales_di_02
create table st_store_sales_di_02 as 
select stat_date
       ,max(case when store_name = "广州店" then sales_amt end) as guangzhou 
	   ,max(case when store_name = "北京店" then sales_amt end) as beijing
	   ,max(case when store_name = "上海店" then sales_amt end) as shanghai 
  from st_store_sales_di
 group by stat_date

现有数据如下:

如何将每一列门店的销售数据按行展示:

SQL实现

select stat_date,"广州店" as store_name, guangzhou as sales_amt  from st_store_sales_di_02
union all 
select stat_date,"北京店" as store_name, beijing as sales_amt  from st_store_sales_di_02
union all 
select stat_date,"上海店" as store_name, shanghai as sales_amt  from st_store_sales_di_02 

大家可以去实现实现。当然,还有很多种写法,欢迎大家评论交流~

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据_苡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值