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,COLLECTDATETIMEOPEN authors_cursorFETCH NEXT FROM authors_cursor
INTO @MEASURESETID, @COLLECTDATETIME,@INCEPTDATETIME,@DATADICTIONARYSYMBOL,@RAWDATAWHILE @@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_cursorINSERT INTO dbo.measureSetRaw
SELECT * FROM #TEMPDROP TABLE #TEMP
END
GO目标是从多行表DBO.MEASURESETRAWDATA 中把数据转存到多列表dbo.measureSetRaw
(
@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,COLLECTDATETIMEOPEN authors_cursorFETCH NEXT FROM authors_cursor
INTO @MEASURESETID, @COLLECTDATETIME,@INCEPTDATETIME,@DATADICTIONARYSYMBOL,@RAWDATAWHILE @@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_cursorINSERT INTO dbo.measureSetRaw
SELECT * FROM #TEMPDROP TABLE #TEMP
END
GO目标是从多行表DBO.MEASURESETRAWDATA 中把数据转存到多列表dbo.measureSetRaw
解决方案 »
- 大侠们,帮看看怎么解决这个错误问题?
- 一个表查询的问题,稍微有点复杂
- 启动SQLSERVERAGENT的时候"错误1058,无法启动服务,原因可能是它被禁用或与它相关联的设备没有启动"
- 不能存关系图的问题
- C# 存储过程output调用问题,在线等!
- 大家帮我写个修改日期格式的SQL语句,把2010-12-9修改成2010-12-09
- 附加数据库可不可能丢失数据?
- 如何用Log Explorer读出日志中的sql语句?
- 恳求帮助:ado锁问题(locktype),locktype 为 adlockpessimistic,但却可以添加,修改,另外,Recordcount 在何种条件下不能用? MSDN 上说 cursortype -->adopenforwardoly不能用
- 警告: 已创建表 'trainorg1',但其最大行大小(8821)超过了每行的最大字节数(8060)。如果结果行长度超过 8060 字节,则此表中行的 INSERT 或 UPDATE 将失败。
- 求工作日历的存贮过程或者函数?
- 求一个触发器,在插入修改数据时设定指定的值!
CLOSE authors_cursor 后还得deallocate authors_cursor
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94想变成
姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94create 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
set @sql = @sql + ' from #t group by name'
exec(@sql) drop table #t--结果
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 83 93 74
张三 83 93 73
----------------------------------------------------
如果上述两表互相换一下:即姓名 语文 数学 物理
张三 73 83 93
李四 74 84 94想变成
Name Subject Result
张三 语文 73
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94create table #t
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
select 姓名 as Name,'物理' as Subject,物理 as Result from #t
order by 姓名 desc drop table #t
--结果
Name Subject Result
---------- ------- -----------
张三 数学 83
张三 物理 93
张三 语文 73
李四 数学 84
李四 物理 94
李四 语文 74(所影响的行数为 6 行)
a b
1 1
1 2
1 3
2 1
2 2
3 1
--如何转换成如下结果:
a b
1 1,2,3
2 1,2
3 1 create table tb
(
a int,
b int
)
insert into tb(a,b) values(1,1)
insert into tb(a,b) values(1,2)
insert into tb(a,b) values(1,3)
insert into tb(a,b) values(2,1)
insert into tb(a,b) values(2,2)
insert into tb(a,b) values(3,1)
goif object_id('pubs..f_hb') is not null
drop function f_hb
go--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(b as varchar) from tb where a = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tbdrop table tb--结果
a b
----------- ------
1 1,2,3
2 1,2
3 1(所影响的行数为 3 行)
多个前列的合并
数据的原始状态如下:
ID PR CON OP SC
001 p c 差 6
001 p c 好 2
001 p c 一般 4
002 w e 差 8
002 w e 好 7
002 w e 一般 1
===========================
用SQL语句实现,变成如下的数据
ID PR CON OPS
001 p c 差(6),好(2),一般(4)
002 w e 差(8),好(7),一般(1)if object_id('pubs..tb') is not null
drop table tb
gocreate table tb
(
id varchar(10),
pr varchar(10),
con varchar(10),
op varchar(10),
sc int
)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p', 'c', '差', 6)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p', 'c', '好', 2)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p', 'c', '一般', 4)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w', 'e', '差', 8)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w', 'e', '好', 7)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w', 'e', '一般', 1)
goif object_id('pubs..test') is not null
drop table test
go
select ID,PR,CON , OPS = op + '(' + cast(sc as varchar(10)) + ')' into test from tb--创建一个合并的函数
if object_id('pubs..f_hb') is not null
drop function f_hb
go
create function f_hb(@id varchar(10),@pr varchar(10),@con varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(OPS as varchar) from test where id = @id and @pr = pr and @con = con
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct id ,pr , con , dbo.f_hb(id,pr,con) as OPS from testdrop table tb
drop table test--结果
id pr con OPS
---------- ---------- ---------- -------------------
001 p c 差(6),好(2),一般(4)
002 w e 差(8),好(7),一般(1)(所影响的行数为 2 行)create table b
(col varchar(20))insert b values ('a')
insert b values ('b')
insert b values ('c')
insert b values ('d')
insert b values ('e')
declare @sql varchar(1024)
set @sql=''
select @sql=@sql+b.col+',' from (select col from b) as b
set @sql='select '''+@sql+''''
exec(@sql)
AA 1986 23.5
AA 1987 25.6
AA 1988 23.0
BB 1986 21.0
BB 1987 22.0
BB 1988 22.7
CC 1986 21.8
CC 1987 23.0
CC 1988 21.8
......我想写成这样的表:
序号 年份 AA BB CC ....平均
1 1986 23.5 21.0 21.8 ....22.1
2 1987 25.6 22.0 23.0 ....23.5
3 1988 23.0 22.7 21.8 ....22.5
create table #tab ([站名][char](10),[年份] [int],[数据] [decimal](18, 1))
insert #tab values('AA',1986,23.5)
insert #tab values('AA',1987,25.6)
insert #tab values('AA',1988,23.0)
insert #tab values('BB',1986,21.0)
insert #tab values('BB',1987,22.0)
insert #tab values('BB',1988,22.7)
insert #tab values('CC',1986,21.8)
insert #tab values('CC',1987,23.0)
insert #tab values('CC',1988,21.8)declare @sql varchar(4000)
set @sql = 'select 年份 '
select @sql = @sql + ' , sum(case 站名 when '''+ 站名 +''' then 数据 end) ['+ 站名 +']'
from (select distinct 站名 from #tab) as a
set @sql = @sql + ', avg(数据) as 平均 from #tab group by 年份'
exec(@sql) drop table #tab年份 AA BB CC 平均
---- ----- ----- ----- ----------
1986 23.5 21.0 21.8 22.100000
1987 25.6 22.0 23.0 23.533333
1988 23.0 22.7 21.8 22.500000
--另外的做法
declare @sql varchar(8000)
set @sql='select 年份'
select @sql=@sql+',['+站名+']=max(case 站名 when '''+站名+''' then 数据 end)' from 表 group by 站名 order by 站名
set @sql=@sql+',avg(数据) as 平均 from 表 group by 年份'
exec(@sql)declare @name varchar(1000)
set @name=''
select @name=@name+',max(case when 站名='''+站名+''' then 數據 end) ['+站名+']' from test group by 站名 order by 站名
select @name='select identity(int,1,1)序號,年份'+@name+',cast(avg(數據) as decimal(15,1)) 平均 into #a from test group by 年份 order by 1 select * from #a'
exec (@name)
/*
序號 年份 AA BB CC 平均
1 1986 23.5 21.0 21.8 22.1
2 1987 25.6 22.0 23.0 23.5
3 1988 23.0 22.7 21.8 22.5
*/
编号 类型 结果 编号 9011 9012 9013
a 9011 4300
a 9012 2300
a 9013 1500
Select
编号,
SUM(Case 类型 When '9010' Then 结果 Else 0 End) As [9010],
SUM(Case 类型 When '9020' Then 结果 Else 0 End) As [9020],
SUM(Case 类型 When '9110' Then 结果 Else 0 End) As [9110],
SUM(Case 类型 When '9120' Then 结果 Else 0 End) As [9120]
From
TableName
Group By 编号
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
编号 类型 结果 编号 9011 9012 9013
a 9011 4300
a 9012 2300
a 9013 1500declare @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
gocreate 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)
godeclare @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
*/