我有一张这样的表
employ_id year_text month_text days money
1 2010 1 5# 10
1 2010 1 6# 10
1 2010 1 7# 10
1 2010 1 8# 10
1 2010 1 9# 10
1 2010 1 10# 10
2 2010 1 5# 10
2 2010 1 6# 10
3 2010 1 7# 10
4 2010 1 8# 10
5 2010 1 9# 10
2 2010 1 10# 10如何得到这样的数据
employ_id 5# 6# 7# 8# 9# 10# 1 10 10 10 10 10 10
2 10 10 0 0 0 10
3 0 0 10 0 0 0
4 0 0 0 10 0 0
5 0 0 0 0 10 0
好像直接使用行列转换的方式不行呢
employ_id year_text month_text days money
1 2010 1 5# 10
1 2010 1 6# 10
1 2010 1 7# 10
1 2010 1 8# 10
1 2010 1 9# 10
1 2010 1 10# 10
2 2010 1 5# 10
2 2010 1 6# 10
3 2010 1 7# 10
4 2010 1 8# 10
5 2010 1 9# 10
2 2010 1 10# 10如何得到这样的数据
employ_id 5# 6# 7# 8# 9# 10# 1 10 10 10 10 10 10
2 10 10 0 0 0 10
3 0 0 10 0 0 0
4 0 0 0 10 0 0
5 0 0 0 0 10 0
好像直接使用行列转换的方式不行呢
-- Author :SQL77(只为思齐老)
-- Date :2010-01-16 17:05:05
-- Version:
-- Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
-- Aug 6 2000 00:57:48
-- Copyright (c) 1988-2000 Microsoft Corporation
-- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:#A
if object_id('tempdb.dbo.#A') is not null drop table #A
go
create table #A([employ_id] int,[year_text] int,[month_text] int,[days] varchar(3),[money] int)
insert #A
select 1,2010,1,'5#',10 union all
select 1,2010,1,'6#',10 union all
select 1,2010,1,'7#',10 union all
select 1,2010,1,'8#',10 union all
select 1,2010,1,'9#',10 union all
select 1,2010,1,'10#',10 union all
select 2,2010,1,'5#',10 union all
select 2,2010,1,'6#',10 union all
select 3,2010,1,'7#',10 union all
select 4,2010,1,'8#',10 union all
select 5,2010,1,'9#',10 union all
select 2,2010,1,'10#',10
--------------开始查询--------------------------
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT employ_id'
SELECT @SQL=@SQL+',SUM(CASE WHEN days='''+[days]+''' THEN money ELSE 0 END)AS '''+days+''''
FROM (SELECT DISTINCT days FROM #A)AS T
EXEC( @SQL+' FROM #A GROUP BY employ_id')--select * from #A
----------------结果----------------------------
/* (所影响的行数为 12 行)employ_id 10# 5# 6# 7# 8# 9#
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 10 10 10 10 10 10
2 10 10 10 0 0 0
3 0 0 0 10 0 0
4 0 0 0 0 10 0
5 0 0 0 0 0 10
*/
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/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--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------
-- Author :SQL77(只为思齐老)
-- Date :2010-01-16 17:05:05
-- Version:
-- Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
-- Aug 6 2000 00:57:48
-- Copyright (c) 1988-2000 Microsoft Corporation
-- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:#A
if object_id('tempdb.dbo.#A') is not null drop table #A
go
create table #A([employ_id] int,[year_text] int,[month_text] int,[days] varchar(3),[money] int)
insert #A
select 1,2010,1,'5#',10 union all
select 1,2010,1,'6#',10 union all
select 1,2010,1,'7#',10 union all
select 1,2010,1,'8#',10 union all
select 1,2010,1,'9#',10 union all
select 1,2010,1,'10#',10 union all
select 2,2010,1,'5#',10 union all
select 2,2010,1,'6#',10 union all
select 3,2010,1,'7#',10 union all
select 4,2010,1,'8#',10 union all
select 5,2010,1,'9#',10 union all
select 2,2010,1,'10#',10
--------------开始查询--------------------------
DECLARE @SQL VARCHAR(8000)SET @SQL='SELECT employ_id'SELECT @SQL=@SQL+',SUM(CASE WHEN days='''+LTRIM([days])+'#'' THEN money ELSE 0 END)AS '''+LTRIM(days)+'#'''FROM
(SELECT DISTINCT TOP 100 PERCENT CONVERT(INT,REPLACE(days,'#',''))AS DAYS FROM #A
ORDER BY CONVERT(INT,REPLACE(days,'#','')) )AS T
EXEC( @SQL+' FROM #A GROUP BY employ_id')--select * from #A
----------------结果----------------------------
/* (所影响的行数为 12 行)employ_id 5# 6# 7# 8# 9# 10#
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 10 10 10 10 10 10
2 10 10 0 0 0 10
3 0 0 10 0 0 0
4 0 0 0 10 0 0
5 0 0 0 0 10 0*/
declare @sql varchar(8000)
set @sql='select employ_id'
select @sql=@sql+',['+days+']=sum(case days when '''+days+''' then money else 0 end)'
from (select distinct days from 表名)a
set @sql=@sql+' from 表名 group by employ_id'
exec(@sql)
if object_id('[tb]') is not null drop table [tb]
create table [tb] (employ_id int,year_text int,month_text int,days varchar(3),money int)
insert into [tb]
select 1,2010,1,'5#',10 union all
select 1,2010,1,'6#',10 union all
select 1,2010,1,'7#',10 union all
select 1,2010,1,'8#',10 union all
select 1,2010,1,'9#',10 union all
select 1,2010,1,'10#',10 union all
select 2,2010,1,'5#',10 union all
select 2,2010,1,'6#',10 union all
select 3,2010,1,'7#',10 union all
select 4,2010,1,'8#',10 union all
select 5,2010,1,'9#',10 union all
select 2,2010,1,'10#',10declare @sql varchar(8000)
set @sql='select employ_id'
select @sql=@sql+',['+days+']=sum(case days when '''+days+''' then money else 0 end)'
from (select distinct days from tb)a
set @sql=@sql+' from tb group by employ_id'
exec(@sql)/*结果
employ_id 10# 5# 6# 7# 8# 9#
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 10 10 10 10 10 10
2 10 10 10 0 0 0
3 0 0 0 10 0 0
4 0 0 0 0 10 0
5 0 0 0 0 0 10*/
-- Author :fredrickhu(小F,向高手学习)
-- Date :2010-01-16 17:11:17
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([employ_id] int,[year_text] int,[month_text] int,[days] varchar(3),[money] int)
insert [tb]
select 1,2010,1,'5#',10 union all
select 1,2010,1,'6#',10 union all
select 1,2010,1,'7#',10 union all
select 1,2010,1,'8#',10 union all
select 1,2010,1,'9#',10 union all
select 1,2010,1,'10#',10 union all
select 2,2010,1,'5#',10 union all
select 2,2010,1,'6#',10 union all
select 3,2010,1,'7#',10 union all
select 4,2010,1,'8#',10 union all
select 5,2010,1,'9#',10 union all
select 2,2010,1,'10#',10
--------------开始查询-----------------------------动态
declare @sql varchar(8000)
set @sql = 'select employ_id '
select @sql = @sql + ' , sum(case days when ''' + days + ''' then money else 0 end) [' + days + ']'
from (select distinct days from tb) as a
set @sql = @sql + ' from tb group by employ_id'
exec(@sql) --静态
select
employ_id ,
sum(case days when '10#' then money else 0 end) [10#] ,
sum(case days when '5#' then money else 0 end) [5#] ,
sum(case days when '6#' then money else 0 end) [6#] ,
sum(case days when '7#' then money else 0 end) [7#] ,
sum(case days when '8#' then money else 0 end) [8#] ,
sum(case days when '9#' then money else 0 end) [9#]
from
tb
group by
employ_id----------------结果----------------------------
/* employ_id 10# 5# 6# 7# 8# 9#
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 10 10 10 10 10 10
2 10 10 10 0 0 0
3 0 0 0 10 0 0
4 0 0 0 0 10 0
5 0 0 0 0 0 10(5 行受影响)
*/