跪求sql server2012行转列方案
sql语句实现行转列的3种方法实例
sql语句实现⾏转列的3种⽅法实例前⾔⼀般在做数据统计的时候会⽤到⾏转列,假如要统计学⽣的成绩,数据库⾥查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做⼀下处理,下⾯话不多说了,来⼀起看看详细的介绍。
CREATE TABLE TestTable([Id] [int] IDENTITY(1,1) NOT NULL,[UserName] [nvarchar](50) NULL,[Subject] [nvarchar](50) NULL,[Source] [numeric](18, 0) NULL) ON [PRIMARY]goINSERT INTO TestTable ([UserName],[Subject],[Source])SELECT N'张三',N'语⽂',60 UNION ALLSELECT N'李四',N'数学',70 UNION ALLSELECT N'王五',N'英语',80 UNION ALLSELECT N'王五',N'数学',75 UNION ALLSELECT N'王五',N'语⽂',57 UNION ALLSELECT N'李四',N'语⽂',80 UNION ALLSELECT N'张三',N'英语',100GO这⾥我⽤了三种⽅法来实现⾏转列第⼀种:静态⾏转列select UserName 姓名,sum(case Subject when '语⽂' then Source else 0 end) 语⽂,sum(case Subject when '数学' then Source else 0 end) 数学,sum(case Subject when '英语' then Source else 0 end) 英语 from TestTable group by UserName⽤povit⾏转列select * from(select UserName,Subject,Source from TestTable) testpivot(sum(Source) for Subject in(语⽂,数学,英语)) pvt⽤存储过程⾏转列alter proc pro_test@userImages varchar(200),@Subject varchar(20),@Subject1 varchar(200),@TableName varchar(50)asdeclare @sql varchar(max)='select * from (select '+@userImages+' from'+@TableName+') tabpivot(sum('+@Subject+') for Subject('+@Subject1+')) pvt'exec (@sql)goexec pro_test 'UserName,Subject,Source','TestTable','Subject','语⽂,数学,英语'它们的效果都是这样的以上三种⽅式实现⾏转列,我们可以根据⾃⼰的需求采⽤不同的⽅法总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
sqlserver行转列及列转行的使用
sqlserver⾏转列及列转⾏的使⽤在我们使⽤的数据库表中经常需要⽤到⾏列互相转换的情况,使⽤sql 的关键词 UNPIVOT(列转⾏)和PIVOT(⾏转列)可轻松实现⾏列转换。
⼀、列转⾏:员⼯⽉份排班表存储是采⽤1号~31号作为列的⽅式进⾏存储的现通过 UNPIVOT 将每天的班次⽤⾏进⾏展⽰,sql 如下:SELECT distinct t.Pb_Job_No,t.Year_Month ,convert(int, REPLACE( t.day,'day','')) as day,classno FROM Scheduling_InfoUNPIVOT(classno FOR day IN(Day1,Day2,Day3,Day4,Day5,Day6,Day7 ,Day8 ,Day9,Day10,Day11,Day12,Day13,Day14,Day15,Day16,Day17,Day18,Day19,Day20,Day21,Day22,Day23,Day24,Day25,Day26,Day27,Day28,Day29,Day30,Day31)) Twhere Year_Month='2020-05'and Pb_Job_No='0997'order by Pb_Job_No,day这⾥的关键词是UNPIVOT(classno FOR day IN('⽇期列名') ,其中 ‘day’是存储⽇期的列,classno 是存储原有班次的列查询结果如下:⼆、⾏转列:如果将上述列转⾏查询的结果表定义为 Scheduling_DayInfo,进⾏逆转为原始表,那么sql 语句为:SELECT Pb_Job_No,[1],[2] ,[3] ,[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]fromScheduling_DayInfo PIVOT ( max(classno) FOR[day]IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]) )t结果为:此处的 in 必须是列 day 中的值,使⽤pivot 需要⽤到聚合函数(sum,count,avg,max,min 等),使⽤的场景如考试成绩 sum(score) ,年度销售业绩等,由于此处不需要统计但是⼜必须⽤聚合函数,所以使⽤max 凑合,因为这些函数可以接受字符类型的参数。
sql语句中行转列,以及列转行
sql语句中⾏转列,以及列转⾏⾏转列:图1: --------------------------------------------》》》》 图2:sql执⾏原理:根据id分组,然后select后⾯创建多次查询,⽣成列信息(利⽤case语句给分group by后的语句分类)-- ⾏转列select t.id,sum(case name when'仓库1'then t.num else NULL end) 仓库1,sum(case name when'仓库2'then t.num else NULL end) 仓库2,sum(case name when'仓库3'then t.num else NULL end) 仓库3from tGROUP BY t.id;列转⾏:图1: --------------------------------------------》》》》 图2:第⼀步:sql执⾏原理:每个select语句只查某⼀个字段的值,创建多个查询,然后将多个select语句通过union链接,实现⼀条多列数据变成多⾏⼀列;⽐如⼀⾏仓库1,仓库2,仓库3 最后变成多⾏select p.id, '仓库1' name, p.`仓库1` numfrom pr punionselect p.id, '仓库2' name, p.`仓库2` numfrom pr punionselect p.id, '仓库3' name, p.`仓库3` numfrom pr p执⾏结果:第⼆步:去掉为null的,即不存在⾏select*from (select p.id, '仓库1' name, p.`仓库1` num from pr punionselect p.id, '仓库2' name, p.`仓库2` num from pr punionselect p.id, '仓库3' name, p.`仓库3` num from pr p ) T where T.num is not null order by id, name。
SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents)本文所涉及的内容(Contents)背景(Contexts)实现代码(SQL Codes)方法一:使用拼接SQL,静态列字段;方法二:使用拼接SQL,动态列字段;方法三:使用PIVOT关系运算符,静态列字段;方法四:使用PIVOT关系运算符,动态列字段;扩展阅读一:参数化表名、分组列、行转列字段、字段值;扩展阅读二:在前面的基础上加入条件过滤;二.背景(Contexts)其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把表、分组字段、行转列字段、值这四个行转列固定需要的值变成真正意义的参数化,大家只需要根据自己的环境,设置参数值,马上就能看到效果了。
行转列的效果图如图1所示:(图1:行转列效果图)(一) 首先我们先创建一个测试表,往里面插入测试数据,返回表记录如图2所示:--创建测试表IF EXISTS (SELECT*FROM sys.objects WHERE object_id=OBJECT_ID(N'[dbo].[TestRows2Columns]') AND type in (N'U'))DROP TABLE[dbo].[TestRows2Columns]GOCREATE TABLE[dbo].[TestRows2Columns]([Id][int]IDENTITY(1,1) NOT NULL,[UserName][nvarchar](50) NULL,[Subject][nvarchar](50) NULL,[Source][numeric](18, 0) NULL) ON[PRIMARY]GO--插入测试数据INSERT INTO[TestRows2Columns] ([UserName],[Subject],[Source])SELECT N'张三',N'语文',60UNION ALLSELECT N'李四',N'数学',70UNION ALLSELECT N'王五',N'英语',80UNION ALLSELECT N'王五',N'数学',75UNION ALLSELECT N'王五',N'语文',57UNION ALLSELECT N'李四',N'语文',80UNION ALLSELECT N'张三',N'英语',100GOSELECT*FROM[TestRows2Columns](图2:样本数据)(二) 先以静态的方式实现行转列,效果如图3所示:--1:静态拼接行转列SELECT[UserName],SUM(CASE[Subject]WHEN'数学'THEN[Source]ELSE0END) AS'[数学]',SUM(CASE[Subject]WHEN'英语'THEN[Source]ELSE0END) AS'[英语]',SUM(CASE[Subject]WHEN'语文'THEN[Source]ELSE0END) AS'[语文]'FROM[TestRows2Columns]GROUP BY[UserName]GO(图3:样本数据)(三) 接着以动态的方式实现行转列,这是使用拼接SQL的方式实现的,所以它适用于SQL Server 2000以上的数据库版本,执行脚本返回的结果如图2所示;--2:动态拼接行转列DECLARE@sql VARCHAR(8000)SET@sql='SELECT [UserName],'SELECT@sql=@sql+'SUM(CASE [Subject] WHEN '''+[Subject]+''' THEN [Source] ELSE 0 END) AS '''+QUOTENAME([Subject])+''','FROM (SELECT DISTINCT[Subject]FROM[TestRows2Columns]) AS aSELECT@sql=LEFT(@sql,LEN(@sql)-1) +' FROM [TestRows2Columns] GROUP BY [UserName]'PRINT(@sql)EXEC(@sql)GO(四) 在SQL Server 2005之后有了一个专门的PIVOT 和UNPIVOT 关系运算符做行列之间的转换,下面是静态的方式实现的,实现效果如图4所示:--3:静态PIVOT行转列SELECT*FROM ( SELECT[UserName] ,[Subject] ,[Source]FROM[TestRows2Columns]) p PIVOT( SUM([Source]) FOR[Subject]IN ( [数学],[英语],[语文] ) ) AS pvtORDER BY pvt.[UserName];GO(图4)(五) 把上面静态的SQL基础上进行修改,这样就不用理会记录里面存储了什么,需要转成什么列名的问题了,脚本如下,效果如图4所示:--4:动态PIVOT行转列DECLARE@sql_str VARCHAR(8000)DECLARE@sql_col VARCHAR(8000)SELECT@sql_col=ISNULL(@sql_col+',','') +QUOTENAME([Subject]) FROM[TestRows2Columns]GROUP BY[Subject]SET@sql_str='SELECT * FROM (SELECT [UserName],[Subject],[Source] FROM [TestRows2Columns]) p PIVOT(SUM([Source]) FOR [Subject] IN ( '+@sql_col+') ) AS pvtORDER BY pvt.[UserName]'PRINT (@sql_str)EXEC (@sql_str)(六) 也许很多人到了上面一步就够了,但是你会发现,当别人拿到你的代码,需要不断的修改成他自己环境中表名、分组列、行转列字段、字段值这几个参数,逻辑如图5所示,所以,我继续对上面的脚本进行修改,你只要设置自己的参数就可以实现行转列了,效果如图4所示:--5:参数化动态PIVOT行转列-- =============================================-- Author: <听风吹雨>-- Create date: <2014.05.26>-- Description: <参数化动态PIVOT行转列>-- Blog: <:///gaizai/>-- =============================================DECLARE@sql_str NVARCHAR(MAX)DECLARE@sql_col NVARCHAR(MAX)DECLARE@tableName SYSNAME --行转列表DECLARE@groupColumn SYSNAME --分组字段DECLARE@row2column SYSNAME --行变列的字段DECLARE@row2columnValue SYSNAME --行变列值的字段SET@tableName='TestRows2Columns'SET@groupColumn='UserName'SET@row2column='Subject'SET@row2columnValue='Source'--从行数据中获取可能存在的列SET@sql_str= N'SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])FROM ['+@tableName+'] GROUP BY ['+@row2column+']'--PRINT @sql_strEXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT --PRINT @sql_colSET@sql_str= N'SELECT * FROM (SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+@sql_col+') ) AS pvt ORDER BY pvt.['+@groupColumn+']'--PRINT (@sql_str)EXEC (@sql_str)(图5)(七) 在实际的运用中,我经常遇到需要对基础表的数据进行筛选后再进行行转列,那么下面的脚本将满足你这个需求,效果如图6所示:--6:带条件查询的参数化动态PIVOT行转列-- =============================================-- Author: <听风吹雨>-- Create date: <2014.05.26>-- Description: <参数化动态PIVOT行转列,带条件查询的参数化动态PIVOT行转列>-- Blog: <:///gaizai/>-- =============================================DECLARE@sql_str NVARCHAR(MAX)DECLARE@sql_col NVARCHAR(MAX)DECLARE@sql_where NVARCHAR(MAX)DECLARE@tableName SYSNAME --行转列表DECLARE@groupColumn SYSNAME --分组字段DECLARE@row2column SYSNAME --行变列的字段DECLARE@row2columnValue SYSNAME --行变列值的字段SET@tableName='TestRows2Columns'SET@groupColumn='UserName'SET@row2column='Subject'SET@row2columnValue='Source'SET@sql_where='WHERE UserName = ''王五'''--从行数据中获取可能存在的列SET@sql_str= N'SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'--PRINT @sql_strEXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT --PRINT @sql_colSET@sql_str= N'SELECT * FROM (SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM['+@tableName+']'+@sql_where+') p PIVOT(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+@sql_col+') ) AS pvt ORDER BY pvt.['+@groupColumn+']'--PRINT (@sql_str)EXEC (@sql_str)(图6)。
sqlserver行转列函数
sqlserver行转列函数SQL Server中有多种方法可以将行转列,包括使用PIVOT函数、CASE语句和动态SQL等。
在接下来的讨论中,我将介绍这些方法,并提供示例来帮助您理解。
1.使用PIVOT函数:PIVOT函数是SQL Server中实现行转列功能的内置函数。
它将一个由行组成的结果集转换为具有动态列的结果集。
以下是使用PIVOT函数将行转列的示例:```sqlSELECT*FROMSELECT employee_id, department, salaryFROM employeesAS srPIVOTSUM(salary)FOR department IN ([IT], [Finance], [HR])AS piv```在上面的示例中,我们选择员工ID、部门和薪水,并使用PIVOT函数将部门作为列转换。
每个部门的薪水总和将作为新的列显示。
2.使用CASE语句:CASE语句是一种常见的在SQL中实现行转列的方法。
通过使用CASE 语句,我们可以将满足特定条件的行值转换为动态列。
以下是使用CASE语句进行行转列的示例:```sqlSELECT employee_id,MAX(CASE WHEN department = 'IT' THEN salary END) AS IT,MAX(CASE WHEN department = 'Finance' THEN salary END) AS Finance,MAX(CASE WHEN department = 'HR' THEN salary END) AS HRFROM employeesGROUP BY employee_id;```在上面的示例中,我们首先通过GROUPBY将结果按照员工进行分组,然后使用CASE语句将不同部门的薪水作为新的列。
3.使用动态SQL:动态SQL是一种使用SQL Server中的字符串操作来构建和执行动态查询的方法。
sql 的行列转换
sql 的行列转换在 SQL 中进行行列转换是一种常见的数据操作,它可以将数据从行的形式转换为列的形式,或者从列的形式转换为行的形式。
下面是两种常见的行列转换方法:1. 使用 `PIVOT` 语句进行行列转换:`PIVOT` 是 SQL 中专门用于进行行列转换的语句。
它允许你将一个表中的行数据按照特定的列值进行分组,并将其他列的值转换为新的列。
下面是一个简单的示例,假设有一个名为 `sales` 的表,包含以下列:`product_id`、`category` 和 `quantity`。
```sqlSELECT category, SUM(quantity) AS total_quantityFROM salesGROUP BY category;```上述示例使用 `GROUP BY` 子句按照 `category` 列进行分组,并使用 `SUM` 函数计算每个分组的 `quantity` 列的总和。
2. 使用 `UNION ALL` 和子查询进行行列转换:有时候,你可能无法直接使用 `PIVOT` 语句进行行列转换,或者你需要更复杂的转换逻辑。
在这种情况下,可以使用 `UNION ALL` 和子查询来实现。
下面是一个示例,将一个包含员工信息的表转换为按部门和职位分类的交叉表。
```sqlSELECT department, job_title, COUNT(*) AS countFROM employeesGROUP BY department, job_title;SELECT department, 'All Jobs' AS job_title, COUNT(*) AS countFROM employeesGROUP BY department;```上述示例使用了两个子查询,一个按照 `department` 和 `job_title` 进行分组,另一个按照 `department` 进行分组,并将所有职位都归为一个名为 `All Jobs` 的虚拟职位。
sql server 行转列写法
在SQL Server 中实现行转列的方法有多种,这里介绍两种比较常用的方法。
方法一:使用PIVOT函数PIVOT函数是SQL Server中自带的一个聚合函数,可以将行数据转换为列数据。
它的使用方式如下:SELECT *FROM(SELECT 列1, 列2, 列3FROM 表名) tPIVOT(聚合函数(列值)FOR 转换列IN (列1, 列2, 列3)) p;具体来说,我们需要将要进行转换的列和对应的值用子查询的形式先查询出来,然后在最外层使用PIVOT函数进行转换。
其中,聚合函数可以是SUM、AVG、MAX等,表示对每个列值进行聚合的方式;FOR子句指定需要进行转换的列;IN子句则是列值列表。
举例来说,如果有如下一个表格:Name Subject ScoreTom Math80Tom English90Tom Chinese75Jack Math85Jack English92Jack Chinese88那么我们可以使用如下的代码进行行转列:SELECTName,[Math], [English], [Chinese]FROM(SELECT Name, Subject, ScoreFROM Scores) scoresPIVOT(AVG(Score)FOR Subject IN ([Math], [English], [Chinese])) p;转换结果如下:Name Math English ChineseTom809075Jack859288方法二:使用UNPIVOT函数UNPIVOT函数是PIVOT函数的逆操作,在SQL Server中同样可以用来实现行转列。
它的使用方式如下:SELECT 列名, 列值FROM 表名UNPIVOT(列值FOR 列名IN (列1, 列2, 列3)) unpvt;具体来说,我们需要指定要进行转换的列列表,然后在最外层使用UNPIVOT函数进行转换。
其中,列值和列名是成对出现的,表示要进行转换的每一条数据。
使用SQLSERVERPIVOT实现行列转置
使⽤SQLSERVERPIVOT实现⾏列转置⼀般我们在使⽤SQL语句实现⾏列转置时候,最常⽤的⽅法⽆外乎就是 case语句来实现,但是如果需要需要转置的列太多,那么case起来语句就⽆限庞⼤,⼗分不⽅便,sql server中的PIVOT就可以帮助我们解决此类问题PIVOT語法,如下:SELECT <non-pivoted column>,[first pivoted column] AS <column name>,[second pivoted column] AS <column name>,...[last pivoted column] AS <column name>FROM(<SELECT query that produces the data>)AS <alias for the source query>PIVOT(<aggregation function>(<column being aggregated>)FOR[<column that contains the values that will become column headers>]IN ( [first pivoted column], [second pivoted column],... [last pivoted column])) AS <alias for the pivot table><optional ORDER BY clause>;PIVOT語法剖析:PIVOT的語法分三層,⽤三個步驟來使⽤。
第⼀步驟:先把要PIVOT的原始資料查詢(Query)好。
第⼆步驟:設定好PIVOT的欄位與⽅式。
第三步驟:依PIVOT好了的資料,呈現結果。
SELECT <non-pivoted column>, ---- 第三步驟在此,呈現PIVOT後的資料。
sql行列转换最简单的方法
sql行列转换最简单的方法SQL行列转换是把SQL中的行数据转换为列数据,或者把列数据转换为行数据的过程。
它是一种常用的数据库操作,可以更好地分析和提取数据,使数据更加清晰明了。
SQL行列转换最简单的方法是使用SQL聚合函数。
聚合函数是用来汇总数据,例如求平均值、求和等,它可以将行数据按照指定的列进行分组并汇总计算,从而将数据转换为列数据。
例如,有一张表student,包含以下字段:name | score1 | score2 | score3张三 | 75 | 80 | 85李四 | 90 | 85 | 80使用聚合函数将行数据转换为列数据可以使用如下SQL语句:SELECT name,AVG(score1) AS score1,AVG(score2) AS score2,AVG(score3) AS score3FROM studentGROUP BY name;结果为:name | score1 | score2 | score3张三 | 75 | 80 | 85李四 | 90 | 85 | 80可以看到,使用聚合函数可以将行数据转换为列数据,实现SQL 行列转换。
此外,还可以使用SQL语句的UNION ALL操作实现行列转换。
UNION ALL操作是把多个SELECT语句的结果合并在一起,可以把多个列的数据转换为一个列的数据,从而实现行列转换。
例如,有一张表student,包含以下字段:name | score1 | score2 | score3张三 | 75 | 80 | 85李四 | 90 | 85 | 80使用UNION ALL操作将列数据转换为行数据可以使用如下SQL语句:SELECT name, score1 FROM studentUNION ALLSELECT name, score2 FROM studentUNION ALLSELECT name, score3 FROM student;结果为:name | score张三 | 75李四 | 90张三 | 80李四 | 85张三 | 85李四 | 80可以看到,使用UNION ALL操作可以将列数据转换为行数据,实现SQL行列转换。
sql行转列的几种方法
sql行转列的几种方法SQL语言中,行转列是一种常见的数据转换操作,用于将行数据转换为列数据,以便更方便地进行数据分析和统计。
在实际的数据处理中,行转列操作有多种方法可以实现,本文将介绍其中的几种常用方法。
一、使用CASE语句CASE语句是SQL语言中的条件表达式,可以根据条件返回不同的结果。
在行转列操作中,可以使用CASE语句将多个行数据转换为对应的列数据。
例如,有一个表格包含了员工的姓名和所属部门信息,现在要将部门信息转换为列数据,可以使用如下的SQL语句:```SELECT姓名,CASE WHEN 部门 = '部门A' THEN '是' ELSE '否' END AS 部门A,CASE WHEN 部门 = '部门B' THEN '是' ELSE '否' END AS 部门B,CASE WHEN 部门 = '部门C' THEN '是' ELSE '否' END AS 部门CFROM员工表;```上述SQL语句将根据不同的部门信息,将结果集中的部门列转换为对应的列数据,输出每个员工所属部门的信息。
二、使用PIVOT函数PIVOT函数是一种高级的行转列操作方法,在某些数据库中支持。
该函数可以将行数据转换为列数据,并实现数据的聚合操作。
例如,有一个表格包含了销售人员的姓名、所属部门和销售额信息,现在要将销售额按照部门进行汇总,并将部门数据转换为列数据,可以使用如下的SQL语句:```SELECT姓名,[部门A] AS 部门A销售额,[部门B] AS 部门B销售额,[部门C] AS 部门C销售额FROM(SELECT姓名,部门,销售额FROM销售表) AS 原始数据PIVOT(SUM(销售额)FOR 部门 IN ([部门A], [部门B], [部门C])) AS 转换后的数据;```上述SQL语句中,使用了PIVOT函数将原始数据按照部门进行汇总,并将部门数据转换为列数据,输出每个销售人员在不同部门的销售额信息。
sqlserver行转列函数
sqlserver行转列函数
sqlserver行转列函数
SQL Server行转列函数
SQL Server行转列函数是SQL Server中常用的数据处理功能,它可以将行转换为列,从而实现数据的转换和操作。
SQL Server行转列函数有两种:PIVOT函数和UNPIVOT函数。
PIVOT函数是将行转换为列的函数,它可以将一行的数据转换为多行的数据,从而转换为列。
例如,如果有一个表,其中有一列存储多个值,可以使用PIVOT函数将其转换为多列,每列存储不同值。
UNPIVOT函数是将列转换为行的函数,它可以将多列的数据转换为一行的数据,从而转换为行。
例如,如果有一个表,其中有多列存储不同的值,可以使用UNPIVOT函数将其转换为一行的数据,每行存储不同的值。
SQL Server中的行转列函数主要用于数据统计、报表生成、数据分析等应用中。
它可以帮助用户快速实现数据的转换和操作,从而为用户节省大量的时间和精力,提高工作效率。
总之,SQL Server行转列函数是SQL Server中常用的数据处理功能,它可以帮助用户实现数据的转换和操作,从而提高工作效率,帮助用户提升工作效率。
sql server行转列查询语句
sql server行转列查询语句SQL Server行转列查询语句是一种非常有用的查询技巧,可以将一行的数据转换为多列的形式,这对于某些业务场景非常实用。
本文将详细介绍SQL Server行转列查询语句的使用方法和注意事项,希望能帮助读者更好地掌握这一技巧。
一、什么是行转列查询语句行转列查询语句是一种将一行数据转换为多列数据的查询技巧。
在数据库中,数据通常以行的形式存储,每一行代表一个记录。
但是在某些场景下,我们需要将行数据转换为列数据,以便更好地展示和处理数据。
SQL Server提供了一些函数和关键字来实现行转列查询。
二、行转列查询的应用场景行转列查询常见的应用场景包括以下几种:1. 交叉表查询:将某一列的值作为新列,将另一列的值作为新行,用于统计和分析数据。
2. 报表生成:将多行数据按照某个字段进行分组,转换为多列数据,方便生成报表。
3. 数据展示:将一张表中的多行数据转换为一行数据,用于展示和查询。
三、行转列查询的基本语法SQL Server中实现行转列查询通常使用PIVOT和UNPIVOT关键字。
下面是行转列查询的基本语法:1. PIVOT语法:SELECT [列1], [列2], ...FROM [表名]PIVOT(聚合函数([列名])FOR [列名] IN ([列值1], [列值2], ...)) AS [别名]2. UNPIVOT语法:SELECT [列名], [值]FROM [表名]UNPIVOT([值] FOR [列名] IN ([列1], [列2], ...)) AS [别名]需要注意的是,PIVOT语句中的聚合函数可以是SUM、COUNT、AVG 等,适用于需要对数据进行统计的场景。
四、行转列查询的实际案例为了更好地理解行转列查询,下面以一个实际案例来演示如何使用行转列查询语句。
我们有一个销售数据表sales_data,包含以下列:产品名称(product_name)、区域(region)、销售额(sales_amount)。
SQLServer中几种行列转换的方式
SQLServer中⼏种⾏列转换的⽅式--查询SalesOrder中每年每个⽉各个customer的产⽣的订单总数量1、使⽤PIVOTSELECT x.*FROM ( SELECT YEAR(SalesOrderDate) [Year] ,MONTH(SalesOrderDate) AS [Month] ,CustomerCode ,TotalQTYFROM dbo.SalesOrder) soPIVOT (SUM (so.TotalQTY)FOR [Month] IN ( [1], [2], [3], [4], [5],[6], [7], [8], [9],[10], [11], [12] ))xORDER BY x.[Year] ,x.CustomerCode2、case whenSELECT YEAR(SalesOrderDate) AS Year,CustomerCode,SUM(CASE MONTH(SalesOrderDate)WHEN 1 THEN TotalQTY END) AS '1',SUM(CASE MONTH(SalesOrderDate)WHEN 2 THEN TotalQTY END) AS '2',SUM(CASE MONTH(SalesOrderDate)WHEN 3 THEN TotalQTY END) AS '3',SUM(CASE MONTH(SalesOrderDate)WHEN 4 THEN TotalQTY END) AS '4',SUM(CASE MONTH(SalesOrderDate)WHEN 5 THEN TotalQTY END) AS '5',SUM(CASE MONTH(SalesOrderDate)WHEN 6 THEN TotalQTY END) AS '6',SUM(CASE MONTH(SalesOrderDate)WHEN 7 THEN TotalQTY END) AS '7',SUM(CASE MONTH(SalesOrderDate)WHEN 8 THEN TotalQTY END) AS '8',SUM(CASE MONTH(SalesOrderDate)WHEN 9 THEN TotalQTY END) AS '9',SUM(CASE MONTH(SalesOrderDate)WHEN 10 THEN TotalQTY END) AS '10',SUM(CASE MONTH(SalesOrderDate)WHEN 11 THEN TotalQTY END) AS '11',SUM(CASE MONTH(SalesOrderDate)WHEN 12 THEN TotalQTY END) AS '12'FROM dbo.SalesOrder sGROUP BY YEAR(s.SalesOrderDate),CustomerCodeORDER BY YEAR(SalesOrderDate),CustomerCode3、动态条件DECLARE @PivotColHeader VARCHAR(MAX)SELECT @PivotColHeader =COALESCE(@PivotColHeader + ',[' + cast(MONTH(SalesOrderDate) as varchar) + ']', '[' + cast(MONTH(SalesOrderDate) as varchar) + ']') --⽰例中Name转换为varchar或char类型,注意:在CAST 和CONVERT 中使⽤varchar 时,显⽰n的默认值为30FROM SalesOrderGROUP BY MONTH(SalesOrderDate);DECLARE @PivotTableSQL NVARCHAR(MAX)SET @PivotTableSQL = N'SELECT x.*FROM ( SELECT YEAR(SalesOrderDate) [Year] ,MONTH(SalesOrderDate) AS [Month] ,CustomerCode ,TotalQTYFROM dbo.SalesOrder) soPIVOT (SUM (so.TotalQTY)FOR [Month] IN (''))xORDER BY x.[Year] ,x.CustomerCode'EXECUTE sp_executesql @PivotTableSQL。
Sqlsever行转列与列转行
Sqlsever⾏转列与列转⾏CREATE TABLE[dbo].[Chengji]([Name]nvarchar(20) NOT NULL,[Kemu]nvarchar(20) NOT NULL,[Fenhu][int]NULL) ON[PRIMARY]GOALTER TABLE[dbo].[Chengji]ADD DEFAULT ((0)) FOR[Fenhu]GOINSERT[dbo].[Chengji] ([Name], [Kemu], [Fenhu]) VALUES ('张三','语⽂',80)GOINSERT[dbo].[Chengji] ([Name], [Kemu], [Fenhu]) VALUES ('张三','数学',60)GOINSERT[dbo].[Chengji] ([Name], [Kemu], [Fenhu]) VALUES ('张三','英语',99)GOINSERT[dbo].[Chengji] ([Name], [Kemu], [Fenhu]) VALUES ('李四','语⽂',80)GOINSERT[dbo].[Chengji] ([Name], [Kemu], [Fenhu]) VALUES ('李四','数学',80)GOINSERT[dbo].[Chengji] ([Name], [Kemu], [Fenhu]) VALUES ('李四','英语',80)GO--1.⾏转列--⽅法⼀:select name,sum(case kemu when'语⽂'then Fenhu else0end) '语⽂',sum(case kemu when'数学'then Fenhu else0end) '数学',sum(case kemu when'英语'then Fenhu else0end) '英语'fromChengjigroup by Name--⽅法⼆:select*from Chengjipivot (sum(fenhu) for kemu in ([语⽂],[数学],[英语])) as t--2.列转⾏--创建成绩2表select*into Chengji2 from (select*from Chengjipivot (sum(fenhu) for kemu in ([语⽂],[数学],[英语])) as t) t--⽅法⼀:select name,'语⽂'科⽬,语⽂'成绩'from Chengji2 union allselect name,'数学'科⽬,数学'成绩'from Chengji2 union allselect name,'英语'科⽬,英语'成绩'from Chengji2order by name,科⽬--⽅法⼆:select*from Chengji2 UNPIVOT([fenshu]for[成绩]in ([语⽂],[数学],[英语])) as T。
sqlserver行转列
sqlserver⾏转列把多⾏记录放到⼀列:⽤ for xmlcreate table #temp(OrderID int identity(1,1),ProdCode varchar(20),BuyThisProdName varchar(200))insert into #temp values('Apple','Li Ming') ,('Apple','Zhang San'),('Apple','Xiao SI') ,('Apple','Hon Bbb Test') ,('Apple','Mr Test Traveller') ,('HuaWei','Hon echo threetest') ,('HuaWei','Prof Traveller with credit test') ,('HuaWei','Dr echoosabre test')select ProdCode,(STUFF((SELECT ',' + BuyThisProdNameFROM #tempWHERE ProdCode= Test.ProdCodeFORXML PATH('')),1,1,'')) as BuyerListfrom #temp AS TestGROUP BY ProdCodeDROP TABLE #temp这样我们在进⾏拆分,拆成⼀列⼀列的样⼦,但是有个问题是,在⽣产环境中我们并不知道有同⼀类型(apple)有多少⼈购买,因此我们⽆法估计拆分时的最⼤列有多少个(其实可以找到,这⾥就不写了)拆分函数:IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = Object_id(N'[dbo].[fn_find]') AND Objectproperty(id, N'IsTableFunction') = 1) DROP FUNCTION [dbo].[fn_find]GOcreate function fn_find(@find varchar(8000), @str varchar(8000), @n smallint)returns intasbeginif @n < 1 return (0)declare @start smallint, @count smallint, @index smallint, @len smallintset @index = charindex(@find, @str)if @index = 0 return (0)else select @count = 1, @len = len(@find)while @index > 0 and @count < @nbeginset @start = @index + @lenselect @index = charindex(@find, @str, @start), @count = @count + 1endif @count < @n set @index = 0return (@index)endgo动态获取:create table #temp(OrderID int identity(1,1),ProdCode varchar(20),BuyThisProdName varchar(200))insert into #temp values('Apple','Li Ming') ,('Apple','Zhang San'),('Apple','Xiao SI') ,('Apple','Hon Bbb Test') ,('Apple','Mr Test Traveller') ,('HuaWei','Hon echo threetest') ,('HuaWei','Prof Traveller with credit test') ,('HuaWei','Dr echoosabre test')Declare @NumMAXPermission intselect @NumMAXPermission =max(percount)from (select count(*) as percountfrom #tempgroup by ProdCode ) as tif @NumMAXPermission >0Begindeclare @InConditionPermission varchar(4000) , @j int = 1while @j<= @NumMAXPermissionBeginset @InConditionPermission = isnull(@InConditionPermission,'') + ',' + 'Buyer' + convert(varchar(5),@j) set @j = @j + 1continueEndEndset @InConditionPermission = substring(@InConditionPermission ,2,4000)print @InConditionPermissionselect 'Buyer' + convert(varchar(4),ROW_NUMBER() over (partition by ProdCode order by OrderID)) as aa , ProdCode as ProdCode,BuyThisProdName as MergeInfointo ##tempMergePermissionfrom #tempDeclare @sql varchar(max)set @sql = 'select *from ##tempMergePermission as Ppivot(max(MergeInfo) for P.aa in (' + @InConditionPermission + ')) as T'print @sqlexec (@sql)drop table #tempdrop table ##tempMergePermission。
SQLServer中行列转置方法
SQLServer中⾏列转置⽅法PIVOT⽤于将列值旋转为列名(即⾏转列),在SQL Server 2000可以⽤聚合函数配合CASE语句实现PIVOT的⼀般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P完整语法:table_sourcePIVOT(聚合函数(value_column)FOR pivot_columnIN(<column_list>))UNPIVOT⽤于将列明转为列值(即列转⾏),在SQL Server 2000可以⽤UNION来实现完整语法:table_sourceUNPIVOT(value_columnFOR pivot_columnIN(<column_list>))注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使⽤需修改数据库兼容级别在数据库属性->选项->兼容级别改为 90典型实例⼀、⾏转列1、建⽴表格ifobject_id('tb')isnotnulldroptabletbgocreatetabletb(姓名varchar(10),课程varchar(10),分数int)insertintotbvalues('张三','语⽂',74)insertintotbvalues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语⽂',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)goselect*fromtbgo姓名课程分数---------- ---------- -----------张三语⽂ 74张三数学 83张三物理 93李四语⽂ 74李四数学 84李四物理 942、使⽤SQL Server 2000静态SQL--cselect姓名,max(case课程when'语⽂'then分数else0end)语⽂,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理fromtbgroupby姓名姓名语⽂数学物理---------- ----------- ----------- -----------李四 74 84 94张三 74 83 933、使⽤SQL Server 2000动态SQL--SQL SERVER 2000动态SQL,指课程不⽌语⽂、数学、物理这三门课程。
Sqlserver中将数据行转列列转行(一)
Sqlserver中将数据⾏转列列转⾏(⼀)在做⼀些数据分析与数据展⽰时,经常会遇到⾏转列,列转⾏的需求,今天就来总结下:在开始之前,先来创建⼀个临时表,并且写⼊⼀些测试数据:/*第⼀步:创建临时表结构*/CREATE TABLE #Student --创建临时表(StuName nvarchar(20), --学⽣名称StuSubject nvarchar(20),--考试科⽬StuScore int--考试成绩)DROP TABLE #Student --删除临时表SELECT*FROM #Student --查询所有数据/*第⼆步:写⼊测试数据*/--张三INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','语⽂',80);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','数学',75);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('张三','英语',65);--李四INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','语⽂',36);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','数学',56);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('李四','英语',38);--王五INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','语⽂',69);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','数学',80);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('王五','英语',78);--赵六INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','语⽂',80);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','数学',80);INSERT INTO #Student(StuName,StuSubject,StuScore) values ('赵六','英语',95);数据准备好了之后,开始今天的正题:⼀:⾏转列,下⾯是转换之前与之后的截图对⽐⽅法1:使⽤Case when ⽅式SELECT StuSubject,SUM(CASE WHEN StuName='张三' THEN StuScore END) as '张三',SUM(CASE WHEN StuName='王五' THEN StuScore END) as '王五',SUM(CASE WHEN StuName='赵六' THEN StuScore END) as '赵六'FROM #StudentGROUP BY StuSubject适⽤场景:要转换成多少列确定,⽐如上⾯,已经确切知道只有张三、李四、王五、赵六四个⼈;缺点:1.如果有20个⼈,要写20个CASE 判断,写起来恶⼼,代码不优雅;2.⽆法解决列是动态产⽣的问题,⽐如按⽉份⽇期转换2⽉有可能28天,其它⽉份30天;⽅法2:使⽤PIVOT 关键字SELECT *FROM #StudentPIVOT(SUM(StuScore) FOR [StuName] IN("李四","王五","张三","赵六")) AS T适⽤场景:要转换成多少列确定,⽐如上⾯,已经确切知道只有张三、李四、王五、赵六四个⼈;缺点:1.⽆法解决列是动态产⽣的问题,⽐如按⽉份⽇期转换2⽉有可能28天,其它⽉份30天;⽅法3:使⽤PIVOT、EXEC关键Declare@StuName varchar(100);Declare@sql nvarchar(4000)--步骤1.假设列不固定,是动态产⽣的,需要先将所有列组合成⼀个长字符串,⽐如A,B,C ,SELECT@StuName=STUFF((SELECT','+ DS_descriptionFROM Base_SalaColumnWHERE DS_type='3'AND DS_means!='不参与'FOR xml path('')),1,1,'')Print@StuName--步骤2.由于动态产⽣的列,脚本不能执⾏,所以⽤Exec来执⾏,把脚本写成⼀个字符串。
SQLServer-行列转换行转列,多行转多列-max函数用法
SQLServer-⾏列转换⾏转列,多⾏转多列-max函数⽤法效果如图,把同⼀个 code,按 cate 列分为 Actual 和 Budget 两⾏,再把mode 每种类型转换成列名,主要⽤到了 max 函数,很实⽤if exists(select*from tempdb..sysobjects where id=object_id('tempdb..#t'))drop table #tcreate table #t(code varchar(10), cname nvarchar(30),fyear varchar(30),cate varchar(10),mt numeric(18,4),amt numeric(18,2),mode nvarchar(20),mo_mt numeric(18,4),mo_avgfee numeric(18,2),mo_rate nvarchar(20) )insert into #tselect'400',N'深圳','2017','Actual','280','1400','BLK',10,1,'3.57%'union all select'400',N'深圳','2017','Actual','280','1400','V15',20,2,'7.14%'union all select'400',N'深圳','2017','Actual','280','1400','V5',30,3,'10.71%'union all select'400',N'深圳','2017','Actual','280','1400','V0',40,4,'14.29%'union all select'400',N'深圳','2017','Actual','280','1400','V20',50,5,'17.86%'union all select'400',N'深圳','2017','Actual','280','1400','V10',60,6,'21.43%'union all select'400',N'深圳','2017','Actual','280','1400','V25',70,7,'25.00%'union all select'400',N'深圳','2018','Budget','280','0','BLK',10,1,'3.57'union all select'400',N'深圳','2018','Budget','280','0','V15',20,2,'7.14%'union all select'400',N'深圳','2018','Budget','280','0','V5',30,3,'10.71%'union all select'400',N'深圳','2018','Budget','280','0','V0',40,4,'14.29%'union all select'400',N'深圳','2018','Budget','280','0','V20',50,5,'17.86%'union all select'400',N'深圳','2018','Budget','280','0','V10',60,6,'21.43%'union all select'400',N'深圳','2018','Budget','280','0','V25',70,7,'25.00%'select*from #t--增加⼀个强制mode 排序,⽐如从 vo v1 v2 依次排序if exists(select*from tempdb..sysobjects where id=object_id('tempdb..#sort'))drop table #sort create Table #sort ( mode varchar(10), )insert into #sortselect distinct mode FROM #t GROUP BY mode order by mode-- select * from #sortdeclare@sql nvarchar(max) --声明⼀个变量SET@sql='SELECT code '+',cname '+',fyear '+',cate '--+ N'''类别'''+',isnull(mt,0) mt'-- + N'''吨数'''+',isnull(amt,0) amt'-- + N'''⾦额'''select@sql=@sql+' , max(case mode when '''+ mode+''' then mo_rate else '''' end) ['+ mode+']'+' , max(case mode when '''+ mode+''' then mo_avgfee else 0 end) ['+ mode+'_unit]'from (select mode FROM #sort ) as a--print @sqlset@sql=@sql+' from #t group by code, cname,fyear,cate,mt,amt order by code,fyear 'print@sqlexec(@sql) --执⾏该sql。
sqlserver行列转换
sqlserver⾏列转换sqlserver⾏转列--创建⾏转列表及插⼊数据create table tb_RowConvertToColumn(username nvarchar(100) null,course nvarchar(100) null,score numeric(10,2) null)insert into tb_RowConvertToColumn(username,course,score) values('张三','语⽂',82)insert into tb_RowConvertToColumn(username,course,score) values('张三','数学',85)insert into tb_RowConvertToColumn(username,course,score) values('张三','外语',90)insert into tb_RowConvertToColumn(username,course,score) values('李四','语⽂',86)insert into tb_RowConvertToColumn(username,course,score) values('李四','数学',82)insert into tb_RowConvertToColumn(username,course,score) values('李四','外语',92)insert into tb_RowConvertToColumn(username,course,score) values('王五','语⽂',82)insert into tb_RowConvertToColumn(username,course,score) values('王五','数学',94)insert into tb_RowConvertToColumn(username,course,score) values('王五','外语',82)--1.静态sql⾏转列,该sql指定了转换的列头select username 姓名,MAX(case course when'语⽂'then score else0end) 语⽂,MAX(case course when'数学'then score else0end) 数学,MAX(case course when'外语'then score else0end) 外语from tb_RowConvertToColumngroup by usernameorder by username/*姓名语⽂数学外语李四 86.00 82.00 92.00王五 82.00 94.00 82.00张三 82.00 85.00 90.00*/--2.静态sql⾏转列,该sql指定了转换的列头,该语句必须sqlserver2005及以上版本才能使⽤select username 姓名,语⽂,数学,外语from tb_RowConvertToColumn pivot(max(score) for course in(语⽂,数学,外语)) a /*姓名语⽂数学外语李四 86.00 82.00 92.00王五 82.00 94.00 82.00张三 82.00 85.00 90.00*/select*from tb_RowConvertToColumn pivot(max(score)for course in (语⽂,数学,外语)) a/*username 语⽂数学外语李四 86.00 82.00 92.00王五 82.00 94.00 82.00张三 82.00 85.00 90.00*/--3.动态sql⾏转列,⾃动⽣成转换的列declare@sql nvarchar(2000)select distinct course into #tb_group from tb_RowConvertToColumn order by course desc--表头及排序select@sql=ISNULL(@sql+',','')+'MAX(case course when '''+course+''' then score else 0 end) ['+course+']'from #tb_groupset@sql='select username 姓名,'+@sql+' from tb_RowConvertToColumn a'+' group by username'exec(@sql)drop table #tb_group/*姓名语⽂外语数学李四 86.00 92.00 82.00王五 82.00 82.00 94.00张三 82.00 90.00 85.00*/--4.动态sql⾏转列,⾃动⽣成转换的列,该语句必须sqlserver2005及以上版本才能使⽤declare@sql nvarchar(2000)select@sql=ISNULL(@sql+',','')+coursefrom tb_RowConvertToColumngroup by courseset@sql='select * from tb_RowConvertToColumn pivot (max(score) for course in ('+@sql+')) a'exec(@sql)/*username 数学外语语⽂李四 82.00 92.00 86.00王五 94.00 82.00 82.00张三 85.00 90.00 82.00*/sqlserver列转⾏--创建列转⾏表及插⼊数据create table tb_ColumnConvertToRow([姓名]nvarchar(100) null,[语⽂]nvarchar(100) null,[数学]nvarchar(100) null,[外语]nvarchar(100) null)insert into tb_ColumnConvertToRow(姓名,语⽂,数学,外语) values('李四',82,92,86)insert into tb_ColumnConvertToRow(姓名,语⽂,数学,外语) values('王五',94,82,82)insert into tb_ColumnConvertToRow(姓名,语⽂,数学,外语) values('张三',85,90,82)--1.静态sql列转⾏,当列头较少时使⽤select*from(select姓名,课程='语⽂',分数=语⽂from tb_ColumnConvertToRowunion allselect姓名,课程='数学',分数=数学from tb_ColumnConvertToRowunion allselect姓名,课程='外语',分数=外语from tb_ColumnConvertToRow) a/*姓名课程分数李四语⽂ 82王五语⽂ 94张三语⽂ 85李四数学 92王五数学 82张三数学 90李四外语 86王五外语 82张三外语 82*/--2.静态sql列转⾏,当列头较少时使⽤,该语句必须sqlserver2005及以上版本才能使⽤select姓名,课程,分数from tb_ColumnConvertToRow unpivot(分数for课程in (语⽂,数学,外语)) a /*姓名课程分数李四语⽂ 82李四数学 92李四外语 86王五语⽂ 94王五数学 82王五外语 82张三语⽂ 85张三数学 90张三外语 82*/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面为表创建代码:
create table [dbo].[productauditrecord]([parid] [nchar](12)
not null,[moid] [nchar](12)
not null,[lotsn] [nvarchar](50)
not null,[cosmeticinspection] [nchar](12)
not null,[functionaltest] [nchar](12)
not null,[unumber] [nchar](50)
null,[leadwire] [nchar](50)
null,[resourceid] [nchar](12)
not null,[userid] [nchar](12)
not null,[remark] [nvarchar](100)
null,[creatdate] [datetime] not null,[productid] [nchar](12)
not null,[nextid] [int] not null, constraint [pk_productauditrecord] primary key clustered ([parid] asc)with
(pad_index = off, statistics_norecompute = off,
ignore_dup_key = off, allow_row_locks = on,
allow_page_locks = on) on [primary])
on [primary]goalter table [dbo].[productauditrecord] add
constraint [df_productauditrecord_parid] default
(substring(convert([char](36),
newid(),(0)),(1),(12)))
for [parid]goalter table [dbo].
[productauditrecord] add constraint
[df_productauditrecord_nextid] default
((0))
for [nextid]go
下面为自己测试数据得到的结果:上面为原始数据,下面为转换后的数据:转换代码测试表代码:create table [dbo].[test](
[月份] [varchar](4) null,
[工资] [int] null,
[福利] [int] null,
[奖金] [int] null
) on [primary]
1:月份工资福利奖金
1月100 200 300
2月110 210 310
3月120 220 320
4月130 230 330
2:考核月份1月2月3月4月
福利200 210 220 230
工资100 110 120 130
奖金300 310 320 330
select * from
(
select 考核月份,月份,金额from
(select 月份,工资,福利,奖金from test) p unpivot
(金额for 考核月份in (工资,福利,奖金))as unpvt ) t
pivot
(max(金额) for 月份in ([1月],[2月],[3月],[4月]))as pt 更多信息请查看IT技术专栏。