日期:2014-05-18  浏览次数:20483 次

这样的行列该怎样转换呢?在线等
表中列名:EquClassname,equclassid,equtypename,equtypeid,opttypename,optnumsum
表中示例数据:
监控单元 2 HRWCSU 12 返修入库 37
监控单元 2 HRWCSU 12 待修出库 16
监控单元 2 HRWCSU 12 报废 4
监控单元 2 HRWCSU 12 修完入库 10
监控单元 2 HRWCSU 12 发货出库 10
电源模块 3 HRM1S50   48V/50A 1 返修入库 35
电源模块 3 HRM1S50   48V/50A 1 待修出库 20
电源模块 3 HRM1S50   48V/50A 1 报废 2
电源模块 3 HRM1S50   48V/50A 1 修完入库 15
电源模块 3 HRM1S50   48V/50A 1 发货出库 10

其中:opttypename是固定的,想将数据转换成如下格式
表列名:EquClassname,equtypename,返修入库,待修出库,报废,修完入库,发货出库
表数据:监控单元,HRWCSU,37,16,4,10,10
                电源模块,HRM1S50   48V/50A,35,20,2,15,10

请问该怎么做?



------解决方案--------------------
--前提.opttypename是固定的
select EquClassname,equtypename ,
sum(case when opttypename = '返修入库 ' else optnumsum else 0 end ) 返修入库,
sum(case when opttypename = '待修出库 ' else optnumsum else 0 end ) 待修出库,
sum(case when opttypename = '报废 ' else optnumsum else 0 end ) 报废,
sum(case when opttypename = '修完入库 ' else optnumsum else 0 end ) 修完入库,
sum(case when opttypename = '发货出库 ' else optnumsum else 0 end ) 发货出库
from 表
group by EquClassname,equtypename

------解决方案--------------------
Select
EquClassname,
equtypename,
返修入库 = Max(Case opttypename When '返修入库 ' Then optnumsum Else 0 End),
待修出库 = Max(Case opttypename When '待修出库 ' Then optnumsum Else 0 End),
报废 = Max(Case opttypename When '报废 ' Then optnumsum Else 0 End),
修完入库 = Max(Case opttypename When '修完入库 ' Then optnumsum Else 0 End),
发货出库 = Max(Case opttypename When '发货出库 ' Then optnumsum Else 0 End)
From

Group By
EquClassname,
equtypename
------解决方案--------------------
如果不固定


Declare @S Varchar(8000)
Select @S = 'Select EquClassname, equtypename '
Select @S = @S + ', ' + opttypename + ' = Max(Case opttypename When ' ' ' + opttypename + ' ' ' Then optnumsum Else 0 End) '
From 表 Group By opttypename
Select @S = @S + ' From 表 Group By EquClassname, equtypename '
EXEC(@S)
------解决方案--------------------
--如果不固定,用下面的动态SQL.

create table tb (EquClassname varchar(10),equclassid int,equtypename varchar(20),equtypeid int,opttypename varchar(10),optnumsum int)
insert into tb values( '监控单元 ',2, 'HRWCSU ',12, '返修入库 ',37)
insert into tb values( '监控单元 ',2, 'HRWCSU ',12, '待修出库 ',16)
insert into tb values( '监控单元 ',2, 'HRWCSU ',12, '报废 ',4)
insert into tb values( '监控单元 ',2, 'HRWCSU ',12, '修完入库 ',10)
insert into tb values( '监控单元 ',2, 'HRWCSU ',12, '发货出库 ',10)
insert into tb values( '电源模块 ',3, 'HRM1S50 48V/50A ',1, '返修入库 ',35)
insert into tb values( '电源模块 ',3, 'HRM1S50 48V/50A ',1, '待修出库 ',20)
insert into tb values( '电源模块 ',3, 'HRM1S50 48V/50A ',1, '报废 ',2)
insert into tb values( '电源模块 ',3, 'HRM1S50 48V/50A ',1, '修完入库 ',15)
insert into tb values( '电源模块 ',3, 'HRM1S50 48V/50A ',1, '发货出库 ',10)
go
declare @sql varchar(8000)
set @sql = 'select EquClassname,equtypename '
select @sql = @sql + ' , sum(case opttypename when ' ' ' + opttypename + ' ' ' then optnumsum else 0 end) [ ' + optty