SQL中行转列的方法【简单详细】

SQL中行转列的方法

Sql中的的PIVOT:

最近自己在进行一个功能的查询时,发现要拿取查询一张表某一列的数据转成行输出为一张临时表引用

但是:突然发现,怎么用SQL实现列转行;发现PIVOT真好适合(下饭~学习一波!)(参考好几篇…)

1.总纲速览

在这里插入图片描述

作用:

  1. 将表达式的某一列中的唯一值转换为输出中的多个列来旋转表值表达式,
  2. 且在必要时最终输出中所需的任何其余列值执行聚合.

大白话:

就是实现列转行

2.具体代码实现

2.1首先创建测试表

--创建测试表
create table DailyIncome(VendorId nvarchar(50), IncomeDay nvarchar(50), IncomeAmount int,FacName nvarchar(50))
--插入数据(根据需要自己添加测试)
insert into  DailyIncome(VendorId,IncomeDay,IncomeAmount,FacName)
select  '1002','MON',15000,'MES_1' UNION ALL
select  '1001','TUE',16000,'MES_2' UNION ALL
select  '1001','THU',17000,'MES_3' UNION ALL
select  '1001','FRI',18000,'MES_4' UNION ALL
select  '1001','SAT',19000,'MES_5' UNION ALL
select  '1001','SUN',25000,'MES_6' UNION ALL
select  '1002','TUE',16000,'MES_2' UNION ALL
select  '1003','THU',17000,'MES_3' UNION ALL
select  '1004','FRI',18000,'MES_4' UNION ALL
select  '1005','SAT',19000,'MES_5' UNION ALL
select  '1006','SUN',25000,'MES_6' 

使用CASE WHEN实现

这代码没啥解释的…

select VendorId ,
            sum(case when IncomeDay='MoN' then IncomeAmount else 0 end) as MON,
            sum(case when IncomeDay='TUE' then IncomeAmount else 0 end) as TUE,
            sum(case when IncomeDay='WED' then IncomeAmount else 0 end) as WED,
            sum(case when IncomeDay='THU' then IncomeAmount else 0 end) as THU,
            sum(case when IncomeDay='FRI' then IncomeAmount else 0 end) as FRI,
            sum(case when IncomeDay='SAT' then IncomeAmount else 0 end) as SAT,
            sum(case when IncomeDay='SUN' then IncomeAmount else 0 end) as SUN
from DailyIncome group by VendorId

2.2使用pivot函数实现行转列

这里我们采用经典三部曲法

  1. 首先明白数据源,我们这里数据源=DailyIncome
  2. 新列值:确定哪一列的值作为新列的值
  3. 确定新列的要求的那些值
select * from 
	(select VendorId,IncomeAmount,IncomeDay from DailyIncome) as #temp1  --第一步数据源
	pivot
	(
		sum (IncomeAmount) ----第三步
		for IncomeDay in ([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]) ---第二步
	) as   AvgIncomePerDay

注意:使用pivot函数,会把选中的其他值列作为group by分组条件

执行结果:
在这里插入图片描述

3.补充

行转列

3.1UNION ALL

select Id,StuName,Course,Score,ROW_NUMBER()over(order by Id asc) as RowIndex from
(
        select Id,StuName,Course='英语',Score=YingYu from Scores
        union all
        select Id,StuName,Course='语文',Score=YuWen from Scores
        union all
        select Id,StuName,Course='化学',Score=HuaXue from Scores
) as #temp1
where StuName='jay'

3.2UNPIVOT

select * from Scores -- 数据源
UNPIVOT
(
	Score for Subject in ([YingYu],[YuWen],[HuaXue])
) as StuScores

OK!!!致辞结束请添加图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL行转列和列转行是两种不同的数据处理方式。行转列是将一行数据转换为多列数据,而列转行则是将多列数据转换为一行数据。 行转列可以使用MySQL的group_concat函数来实现。该函数可以将同一组的行合并为一个字段,并使用指定的分隔符进行拼接。通过group_concat函数的参数可以明确指定要返回的列。分组是根据group by指定的列进行的。 列转行的实现方法有多种。其一种方法是使用MySQL的子查询和字符串函数。可以使用SUBSTRING_INDEX和REPLACE函数来分割和替换字符串,从而将多列数据合并为一列。这个过程需要使用到临时表和变量来生成行号,然后再根据行号进行拼接。 请注意,以上引用内容提供的是两种不同的方法,可以根据实际情况选择适合的方法进行行转列或列转行的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [sql查询:行转列和 列转行](https://blog.csdn.net/weixin_40482816/article/details/109395069)[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: 50%"] - *2* *3* [sql 行转列 列转行 总结](https://blog.csdn.net/cheqian2116/article/details/100719372)[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: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值