SQLServer行转列实现思路记录

日期:2020-04-29编辑作者:数据库

1.相关数据表 Score表 [User]表 SQL语句如下: 复制代码 代码如下: --查询出各科成绩最好的学生信息 --自连接 --SELECT TOP 1 * FROM Score B WHERE B.ScoreName = '数学' ORDER BY B.Score DESC SELECT A.ID,U.Name,A.ScoreName,A.Score FROM Score A,[User]U WHERE UID IN (SELECT TOP 1 UID FROM Score B WHERE B.ScoreName = A.ScoreName ORDER BY B.Score DESC) AND A.UID=U.ID ORDER BY A.ScoreName, A.Score DESC 查询结果如下图:

最近面试遇到了一道面试题,顿时有点迷糊,只说出了思路,后来百度了一下,整理了一下思路,于是记录下来,方便以后学习。 相关的数据表: 1.Score表 2.[www.129028.com金沙,User]表 SQL语句如下: --方法一:静态SQL 复制代码 代码如下: SELECT * FROM (SELECT UID,Name, Score,ScoreName FROM Score,[User] WHERE Score.UID=[User].ID) AS SourceTable PIVOT(AVG(Score)FOR ScoreName IN ([英语], [数学])) AS a --方法二:动态SQL 复制代码 代码如下: DECLARE @s NVARCHAR(4000) SELECT @s = ISNULL(@s + ',', '') + QUOTENAME(ScoreName) FROM (select distinct ScoreName from Score) as A ---列名不要重复 Declare @sql NVARCHAR(4000) SET @sql=' select r.* from (select UID,Name,ScoreName,Score from Score,[User] where Score.UID=[User].ID) as t pivot ( max(t.Score) for t.ScoreName in ('+@s+') ) as r' EXEC( @sql) --方法三:Case When 复制代码 代码如下: select row_number() OVER(ORDER BY [User].ID) as 编号, UID as 用户编号, Name as 姓名, max(case ScoreName when '英语' then Score else 0 end) 英语, max(case ScoreName when '数学' then Score else 0 end) 数学 from Score,[User] WHERE Score.UID=[User].ID group by UID,[User].ID,Name

本文由www.129028.com金沙发布于数据库,转载请注明出处:SQLServer行转列实现思路记录

关键词:

SQL Server 2000的安全配置

SQLserver2000数据库应用非常广泛,一旦出现安全问题,造成的损失往往难以估量!应提前预防,防患于未然。这里,我...

详细>>

如何查看某个查询用了多少TempDB空间www.129028.com金沙

DECLARE @read BIGINT, @write BIGINT; SELECT @read = SUM(num_of_bytes_read), @write = SUM(num_of_bytes_written) FROM tempdb.sys.database_files AS DBFJOI...

详细>>

浅析SQL语句中GROUP BY的用法

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想 你用了GROUP BY 按 ITEM.ITEMNUM这个字段分组,那其他字...

详细>>

微软总是试图使它的软件安装尽可能地简单顺www.129028.com金沙

如果你没有特意记录安装日期,那么有没有办法从SQL Server里查询到呢?想想我们在安装的时候,肯定会有Windows认证登...

详细>>