SQL如何实现数据表行转列、列转行?

嘿,这个 SQL 行到列和列到行转换真的很轻松且易于使用。
让我告诉你我遇到的陷阱。

几年前,我帮助一位房屋卖家准备了一份报告。
他们的老板坚持在一个 Excel 中查看任意给定时间销售的女装裙子和儿童家具的总价,而不是将它们分开。
您认为这应该怎么做?数据仓库中的表结构是独立的。
一张桌子放女士裙子,另一张桌子放儿童家具。

我会想一想然后继​​续前进。
用 SQL 来做。
我当时使用的是MySQL,我为你移动了代码:
sql 选择 TOTAL(CASE WHEN Product_name = '女式裙子' THEN Product_sale ELSE 0 END) AS 女式裙子促销, TOTAL(CASE WHEN Product_name = '儿童家具' THEN Product_sale ELSE 0 END) AS 儿童家具促销 来自 data_learning.product_order WHERE Product_name IN ('女士裙子', '儿童家具') 按 1 分组;
你看,我将“女装”和“儿童家具”的销售额添加到两列中。
这个 WHEN CASE 是真正的救星。
如果您使用 IF 函数,它可能类似,但我习惯于 CASE WHEN。

然后,他们的老板说他们每个月都要看。
不幸的是,这很复杂。
您需要添加 DATE_FORMAT 函数,以便当商品售出时,它将与该月份关联。
代码很长,但重点仍然是 CASE WHEN。

我也换了职业。
我们正在运行一个活动来计算所有产品的销售额,但老板希望在表格中看到它们,其中一行是产品名称,另一行是销售额。
这需要再次扭转。

我使用 UNION ALL 来做到这一点。
首先更改列并将它们存储在临时表中:
sql 创建临时表 tmp_test AS SELECT '女式裙子' AS 产品类别,TOTAL(product_sales) AS 销量 FROM data_learning.product_order WHERE Product_name = '女式裙子' 所有人的联盟 SELECT '儿童家具' AS 产品类别,SUM(product_sales) AS 销售额 FROM data_learning.product_order WHERE Product_name = '儿童家具';
然后只需 SELECT FROM tmp_test 即可退出。
你看,这很容易,对吧?
但是,让我告诉你,如果你过多地使用 SQL,很容易感到困惑。
上次学员在使用UNION时忘记写ALL了。
结果他只拿了第一个,数据不完整。
他骂我。
你觉得好笑还是不好笑?
总之,行到列、列到行是数据分析非常重要的技能。
如果你多练习,以后肯定会需要的。
这就是我从陷阱中得到的全部经验,所以你要好好记住。

Sql怎么进行列转行?行转列?

列到行:
Oracle1 1 G及以上:使用Unpivot功能。
将多列数据转换为多行数据,例如将产品列转换为销售表中的行。

Oracle1 0G及更早版本:驱动模式。
使用 LEAD 函数在范围内插入行,例如以每月增量插入空白行。
解码方法。
使用DECODE条件进行分隔,例如将状态字段分成几行。
相关查询方法。
取消关联自连接表,例如连接员工和部门表以及取消连接部门列。

行到列:
Oracle1 1 G及以上:使用Pivot功能。
将多行数据转换为多列,例如按地区汇总销售数据。
数据透视是动态的,会自动生成新的列名称。

一般方法:UNION ALL连接。
将多行数据合并为一列,例如使用 UNION ALL 将不同通道的数据合并为一列。

自己掂量一下。