MSSQL横列转纵列

在工作中我们一般会遇到将横列转成纵列的需求,下面是横列转纵列的案例:

1.建表

CREATE TABLE [dbo].[AcrossChangeEndLong](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [Name] [NVARCHAR](50) NOT NULL,
    [Subject] [NVARCHAR](50) NOT NULL,
    [Score] [INT] NOT NULL,
 CONSTRAINT [PK_AcrossChangeEndLong] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[AcrossChangeEndLong] ADD  CONSTRAINT [DF_AcrossChangeEndLong_Score]  DEFAULT ((0)) FOR [Score]
GO

2.具体SQL

SELECT  Name AS ‘姓名‘,
        MAX(CASE [Subject]
              WHEN ‘语文‘ THEN Score
              ELSE 0
            END) AS ‘语文‘ ,
        MAX(CASE [Subject]
              WHEN ‘英语‘ THEN Score
              ELSE 0
            END) AS ‘英语‘ ,
        MAX(CASE [Subject]
              WHEN ‘数学‘ THEN Score
              ELSE 0
            END) AS ‘数学‘
FROM    dbo.AcrossChangeEndLong
GROUP BY Name ORDER BY Name

如果到时候增加了科目,比如增加了化学,这时候为了再次修改,我们可以弄成动态的(根据列自动增加),这里使用的是动态拼接SQL,会根据科目的增加而增加列,具体SQL如下

DECLARE @sql VARCHAR(8000)
SET @sql = ‘SELECT [Name],‘
SELECT  @sql = @sql + ‘SUM(CASE [Subject] WHEN ‘‘‘ + [Subject]
        + ‘‘‘ THEN [Score] ELSE 0 END) AS ‘‘‘ + [Subject] + ‘‘‘,‘
FROM    ( SELECT DISTINCT
                    [Subject]
          FROM      dbo.AcrossChangeEndLong
        ) AS a
SELECT  @sql = LEFT(@sql, LEN(@sql) - 1)
        + ‘ FROM [AcrossChangeEndLong] GROUP BY [Name]‘
PRINT ( @sql )
EXEC(@sql)

另外在SQL Server 2005之后有了一个专门的PIVOT 和 UNPIVOT 关系运算符做行列之间的转换,具体SQL如下

SELECT  *
FROM    ( SELECT    Name AS ‘姓名‘,
                    Subject ,
                    Score
          FROM      dbo.AcrossChangeEndLong
        ) p PIVOT ( MAX(Score) FOR Subject IN ( [数学], [英语], [语文] ) ) AS pvt
ORDER BY pvt.姓名

使用Pivot动态拼接SQL:

DECLARE @sql_str VARCHAR(MAX)
DECLARE @sql_col VARCHAR(MAX)
SELECT  @sql_col = ISNULL(@sql_col + ‘,‘, ‘‘) + QUOTENAME([Subject])
FROM    dbo.AcrossChangeEndLong
GROUP BY [Subject]
SET @sql_str = ‘
SELECT * FROM (
    SELECT [Name],[Subject],[Score] FROM [AcrossChangeEndLong]) p PIVOT
    (SUM([Score]) FOR [Subject] IN ( ‘ + @sql_col + ‘) ) AS pvt
ORDER BY pvt.[Name]‘
PRINT ( @sql_str )
EXEC (@sql_str)

具体效果:

扩展:可能我们需要加一个统计行,我们可以用UNION ALL连接 上一个表的结果【可以将结果存入临时表】,再用函数SUM

时间: 2024-12-24 09:51:50

MSSQL横列转纵列的相关文章

MSSQL纵列转横列

上篇我们说到了横列转纵列,下面就来说下纵列转横列 1.建表 CREATE TABLE [dbo].[EndLongChangeAcross]( [Id] [INT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](50) NOT NULL, [Chinese] [INT] NOT NULL, [English] [INT] NOT NULL, [Math] [INT] NOT NULL, CONSTRAINT [PK_EndLongChangeAcross]

CSS实现横列布局的方法总结

一.使用float实现横列布局的方法 如下面所示:DIV1和DIV2都可以选择向左或者向右浮动50%来实现展示在同一行 div1 div2 实现下面图片中布局的css样式如下: 分析: 1.第一行第一个图片和最后一个图片的左右边距是10px,中间图片的左右边距是5px.布局如下: <section class="active_div1"> <div> <img id="active_div11" src="">

我为什么放弃MySQL?最终选择了MongoDB

最近有个项目的功能模块,为了处理方便,需要操作集合类型的数据以及其他原因.考虑再三最终决定放弃使用MySQL,而选择MongoDB. 两个数据库,大家应该都不陌生.他们最大的区别就是MySQL为关系型数据库,而MongoDB为非关系型数据库.常见的关系型数据库有:MySQL.Oracle.DB2.SQL Server.Postgre SQL等,非关系型数据库有MongoDB.Redis.Memcached.HBse等等. 1.关系型数据库? 非关系型数据库? 关系型数据库可以理解为依赖一个模型来

四旋翼飞行器结构和原理

四旋翼飞行器结构和原理 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 前言:前年做电赛时留下的一套四旋翼飞行器如今只剩下四个旋翼和电机(不知道被谁给拆了,组装零件找不到了),趁着国庆几天假期,希望能够快速的将其重新DIY出来.其中控制和驱动板卡可以暂时先由面包板焊接出来,等验证成功能飞的起来时在重新设计集成电路板来实现整机. 旋翼的原理:升力的来龙去脉 这是空气动力学中的知识,研究的内容十分广泛,本文只关注通识理论,阐述对翼型升力和旋翼升力的原理. 翼

CodeVs 蛇形矩阵

题目链接:http://codevs.cn/problem/1160/ 题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为对角线数字之和 样例输入 Samp

UVA 439-Knight Moves(bfs)

Knight Moves Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that

firefox相关

1.firefox常用命令: about:aboutabout:supportabout:configabout:plugins 2.关于flash插件,都说实用去沙箱版的flash用着不卡,但是我也没觉得官方版的flash有什么卡的地方(14.0.0.179),下面是一些方法: (1)首先要做的事是关闭火狐自带的硬件加速,选项 高级 常规 取消勾选自动启用硬件加速硬件加速,把adobe flash player plugin 卸载了,打开browser 文件夹,新建 plugins 文件夹,下

[算法] N 皇后

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试. 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解.回溯算法就是解决这种问题的“通用算法”,有“万能算法

pandas 运算

Data frame 和 series 的运算:横列相加减:按照index ,row 的方向直接相加减.frame-series纵列相加减:按照 columns,运用算术函数,相加减. frame.sub(series3, axis=0) '''operation between data frame and series '''import numpy as npfrom pandas import Series, DataFrame arr = np.arange(12.).reshape(