读书人

请高手帮忙分析下 行转列的存储过程(

发布时间: 2012-01-31 21:28:41 作者: rapoo

请高手帮忙分析下 行转列的存储过程(附源码)
CREATE PROCEDURE DUMP_GDDATA
(
@Daily smalldatetime
)
AS
BEGIN
CREATE TABLE #TEMP(
MeasureSetID nvarchar (4) NOT NULL ,
CollectDateTime smalldatetime NOT NULL ,
InceptDateTime smalldatetime NOT NULL ,
RawData9010 numeric(18, 4) NULL ,
RawData9020 numeric(18, 4) NULL ,
RawData9110 numeric(18, 4) NULL ,
RawData9120 numeric(18, 4) NULL ,
)
DECLARE @MEASURESETID NVARCHAR(4)
DECLARE @COLLECTDATETIME DATETIME
DECLARE @INCEPTDATETIME DATETIME
DECLARE @DATADICTIONARYSYMBOL NVARCHAR(4)
DECLARE @RAWDATA NUMERIC(18,4)

DECLARE authors_cursor CURSOR FOR
SELECT CAST(MEASURESETID AS nvarchar) AS MEASURESETID,COLLECTDATETIME,INCEPTDATETIME,DATADICTIONARYSYMBOL,RAWDATA
FROM DBO.MEASURESETRAWDATA
WHERE DATEDIFF(DAY,COLLECTDATETIME,@Daily)=0
--WHERE DATEDIFF(DAY,COLLECTDATETIME,@DATETIME)=0
ORDER BY MEASURESETID,COLLECTDATETIME

OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @MEASURESETID, @COLLECTDATETIME,@INCEPTDATETIME,@DATADICTIONARYSYMBOL,@RAWDATA

WHILE @@FETCH_STATUS = 0

BEGIN

IF @DATADICTIONARYSYMBOL= '9010 '
INSERT INTO #TEMP(MeasureSetID,CollectDateTime,INCEPTDATETIME,RawData9010)
VALUES(@MEASURESETID,@COLLECTDATETIME,@INCEPTDATETIME,@RAWDATA)

IF @DATADICTIONARYSYMBOL= '9020 '
INSERT INTO #TEMP(MeasureSetID,CollectDateTime,INCEPTDATETIME,RawData9020)
VALUES(@MEASURESETID,@COLLECTDATETIME,@INCEPTDATETIME,@RAWDATA)

IF @DATADICTIONARYSYMBOL= '9110 '
INSERT INTO #TEMP(MeasureSetID,CollectDateTime,INCEPTDATETIME,RawData9110)
VALUES(@MEASURESETID,@COLLECTDATETIME,@INCEPTDATETIME,@RAWDATA)

IF @DATADICTIONARYSYMBOL= '9120 '
INSERT INTO #TEMP(MeasureSetID,CollectDateTime,INCEPTDATETIME,RawData9120)
VALUES(@MEASURESETID,@COLLECTDATETIME,@INCEPTDATETIME,@RAWDATA)

FETCH NEXT FROM authors_cursor
INTO @MEASURESETID, @COLLECTDATETIME,@INCEPTDATETIME, @DATADICTIONARYSYMBOL,@RAWDATA
END

CLOSE authors_cursor

INSERT INTO dbo.measureSetRaw
SELECT * FROM #TEMP

DROP TABLE #TEMP
END
GO

目标是从多行表DBO.MEASURESETRAWDATA 中把数据转存到多列表dbo.measureSetRaw





[解决办法]
游标存在的错误,是因为你关闭了,但是没有释放
CLOSE authors_cursor 后还得deallocate authors_cursor

[解决办法]
不要用游标

Select Cast(MEASURESETID As nvarchar) As MEASURESETID,
COLLECTDATETIME,
INCEPTDATETIME,
case when DATADICTIONARYSYMBOL= '9010 ' then '9010 'else null end as RawData9010,
case when DATADICTIONARYSYMBOL= '9020 ' then '9020 'else null end as RawData9020,
case when DATADICTIONARYSYMBOL= '9110 ' then '9110 'else null end as RawData9110,
case when DATADICTIONARYSYMBOL= '9120 ' then '9120 'else null end as RawData9120,
RAWDATA
From MEASURESETRAWDATA
Where DATEDIFF(DAY,COLLECTDATETIME,@Daily)=0
and DATADICTIONARYSYMBOL in( '9010 ', '9020 ', '9110 ', '9120 ')

Order By MEASURESETID,COLLECTDATETIME
[解决办法]
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(编号 varchar(10),类型 varchar(10),结果 int)
insert into tb(编号,类型,结果) values( 'a ', '9011 ', 4300)
insert into tb(编号,类型,结果) values( 'a ', '9012 ', 2300)
insert into tb(编号,类型,结果) values( 'a ', '9013 ', 1500)
go

declare @sql varchar(8000)
set @sql = 'select 编号 '
select @sql = @sql + ' , sum(case 类型 when ' ' ' + 类型 + ' ' ' then 结果 else null end) [ ' + 类型 + '] '
from (select distinct 类型 from tb) as a
set @sql = @sql + ' from tb group by 编号 '
exec(@sql)

drop table tb
/*
编号 9011 9012 9013
---------- ----------- ----------- -----------
a 4300 2300 1500
*/

读书人网 >SQL Server

热点推荐