sqlserver行转列

一丶行专列案例【借鉴

1.建立表格

IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb

go

CREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT)

insert into tb VALUES ('张三','语文',74)
insert into tb VALUES ('张三','数学',83)
insert into tb VALUES ('张三','物理',93)
insert into tb VALUES ('李四','语文',74)
insert into tb VALUES ('李四','数学',84)
insert into tb VALUES ('李四','物理',94)

go

SELECT * FROM tb

go

动态sql

--使用stuff()

DECLARE @sql VARCHAR(8000)

SET @sql=''  --初始化变量 @sql

SELECT @sql= @sql+',' + 课程 FROM tb GROUP BY 课程 --变量多值赋值

SET @sql= STUFF(@sql,1,1,'')--去掉首个','

SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

PRINT @sql

exec(@sql)

--或使用isnull()

DECLARE @sql VARCHAR(8000)

--获得课程集合

SELECT @sql= ISNULL(@sql+',','')+课程 FROM tb
GROUP BY 课程           

SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

exec(@sql)

二丶实战

行转列

 

DECLARE @sql VARCHAR(8000)
SET @sql=''  --初始化变量 @sql
SELECT @sql= @sql+',' + '['+Admission_Grade+']' FROM #temp WHERE Admission_Grade>YEAR(GETDATE())-3 GROUP BY Admission_Grade ORDER BY Admission_Grade DESC--变量多值赋值
SET @sql= STUFF(@sql,1,1,'')--去掉首个','

SET @sql='select * from #temp pivot (max(studentCount) for Admission_Grade in ('+@sql+'))a'
PRINT @sql
exec(@sql)

2.

DECLARE @sql VARCHAR(8000)
SET @sql=''  --初始化变量 @sql
SELECT @sql= @sql+',' + '['+Admission_Grade+']' FROM #temp WHERE Admission_Grade>YEAR(GETDATE())-3 GROUP BY Admission_Grade ORDER BY Admission_Grade DESC--变量多值赋值
SET @sql= STUFF(@sql,1,1,'')--去掉首个','
SET @sql = ' select m.* , n.stuCount from
(select  * from (select * from #temp) a pivot (max(studentCount) for Admission_Grade in (' + @sql
    + ')) b) m,
(select Magor_Code,StudyMode,StudyHierarchy,sum(studentCount) as stuCount from #temp WHERE  Admission_Grade>YEAR(GETDATE())-3  group by Magor_Code,StudyMode,StudyHierarchy) n
where m.Magor_Code= n.Magor_Code AND m.StudyMode=n.StudyMode AND m.StudyHierarchy=n.StudyHierarchy
'
PRINT @sql
exec(@sql)

 

转载于:https://www.cnblogs.com/chenze-Index/p/10454742.html

在SQL Server中,行转列是一种将表中的数据转换为列数据的操作。根据提供的引用内容,我们可以使用PIVOT函数来实现行转列操作。首先,创建一个临时表#USER,并插入一些数据。然后使用PIVOT函数将科目列转换为新的列名,并将分数作为对应列的值。最后,使用GROUP BY语句按照姓名进分组,并使用MAX函数获取每个科目的最大值。下面是一个示例的行转列的SQL查询语句: CREATE TABLE #USER ( name NVARCHAR(100), 科目 NVARCHAR(100), 分数 DECIMAL(18,2) ) INSERT INTO #USER (name, 科目, 分数) VALUES ('张三', '语文', 100), ('张三', '英语', 80), ('张三', '数学', 60), ('张三', '物理', 70) SELECT newtemp.name, MAX(newtemp.语文) 语文, MAX(newtemp.英语) 英语, MAX(newtemp.数学) 数学, MAX(newtemp.物理) 物理 FROM #USER s PIVOT ( MAX(分数) FOR 科目 IN (语文, 英语, 数学, 物理) ) AS newtemp GROUP BY newtemp.name 这样的处理方法有助于简化前后端的处理,直接查询转换后的固定列和实体即可,无需再编写大量的特殊处理方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SQL Server 行转列](https://blog.csdn.net/qq_45619623/article/details/126529707)[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、付费专栏及课程。

余额充值