日期:2014-05-16  浏览次数:20989 次

帮忙看一动态行转列。
帮忙指点一个SQL语句怎么写

测试数据


CREATE TABLE [dbo].[Test](
[Name] [nvarchar](50) NULL,
[Day] [int] NULL,
[Num] [int] NULL,
        [OrderValue] [int] NULL
)
INSERT INTO Test VALUES('工作服',1,12,1)
INSERT INTO Test VALUES('工作裤',2,32,2)
INSERT INTO Test VALUES('工作帽',3,33,3)
INSERT INTO Test VALUES('病绒衣',NULL,NULL,4)
INSERT INTO Test VALUES('病绒裤',NULL,NULL,5)
INSERT INTO Test VALUES('病单衣',NULL,NULL,6)
INSERT INTO Test VALUES('病单裤',NULL,NULL,7)
INSERT INTO Test VALUES('隔离衣',NULL,NULL,8)
INSERT INTO Test VALUES('大床单',NULL,NULL,9)
INSERT INTO Test VALUES('床罩',NULL,NULL,10)
INSERT INTO Test VALUES('被套',NULL,NULL,11)
INSERT INTO Test VALUES('枕套',NULL,NULL,12)
INSERT INTO Test VALUES('枕头',NULL,NULL,13)
INSERT INTO Test VALUES('中单',NULL,NULL,14)
INSERT INTO Test VALUES('口罩',NULL,NULL,15)
INSERT INTO Test VALUES('棉大衣',NULL,NULL,16)
INSERT INTO Test VALUES('卫棉被',NULL,NULL,17)
INSERT INTO Test VALUES('卫棉褥',NULL,NULL,18)
INSERT INTO Test VALUES('棉背心',NULL,NULL,19)
INSERT INTO Test VALUES('手术衣',NULL,NULL,20)
INSERT INTO Test VALUES('手术裤',NULL,NULL,21)
INSERT INTO Test VALUES('手术单',NULL,NULL,22)
INSERT INTO Test VALUES('消毒包',NULL,NULL,23)
INSERT INTO Test VALUES('橡皮单',NULL,NULL,24)
INSERT INTO Test VALUES('毛巾',NULL,NULL,25)
INSERT INTO Test VALUES('包布车',NULL,NULL,26)
INSERT INTO Test VALUES('窗帘',NULL,NULL,27)
INSERT INTO Test VALUES('沙发巾',1,0,28)

查出来的效果如下图;
貌似就是动态行转列,不怎么太会,上面的名字是根据标准OrderValue排序的;
下图第一列是日期,1表示一号,第一行表示一号这些类型发生的量,没有就空着;


------解决方案--------------------
普通行列转换

假设有张学生成绩表(t)如下

Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94

想变成 
姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94

create table #t
(
   Name    varchar(10) ,
   Subject varchar(10) ,
   Result  int
)

insert into #t(Name , Subject , Result) values('张三','语文','73')
insert into #t(Name , Subject , Result) values('张三','数学','83')
insert into #t(Name , Subject , Result) values('张三','物理','93')
insert into #t(Name , Subject , Result) values('李四','语文','74')
insert into #t(Name , Subject , Result) values('李四','数学','83')
insert into #t(Name , Subject , Result) values('李四','物理','93')

declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
from (select distinct Subject from #t) as a