注册 登录
编程论坛 SQL Server论坛

请教关于SQL交叉 插入数据

supduo 发布于 2010-11-01 17:36, 689 次点击
比如现在有2张表T1和T2
 T1表为                              T2表为空表 表头是:
案号   工作模块    时间          案号  A    B   C   D   E   F   G   H   I   J      
001         A        6                     
002         B        7
002         C        1
003         J        3
003         I        4
执行结果为
案号  A    B   C   D   E   F   G   H   I   J
001    6
002          7    1
003                                    4   3
大致就是这个样子
结果要保存到表T2中,表中空的单元值为null
6 回复
#2
tangyunzhong2010-11-01 21:27
回复 楼主 supduo
你去看一下行列旋转吧,行列旋转就能实现你的功能
#3
cnfarer2010-11-02 08:06
试试:select 案号,sum(when 工作模块 case 'A' then 时间 else 0) as A,
                  sum(when 工作模块 case 'B' then 时间 else 0) as B,
                  ...
       from T1
       group by 案号
#4
zhaoyang10082010-11-02 11:26
程序代码:
declare @a int
        ....
        @j int
        @count int
        @ n int
        @anhao varchar(20)--对应于字段案号
      
      set @n=1
select @count=count(*) from T1
select 案号,工作模块,时间,identity(int,1,1) as ID
into a
from T1 order by 案号--创建一个新表,添加一个字段ID用来逐条取出记录,并用案号排序,使得相同案号的记录挨在一起
while(@n<=@count)
begin

select @anhao=案号,case 工作模块
                    when 'A' then  @a=时间
                    when 'B' then  @b=时间
                    when 'C' then  @c=时间
                    when 'D' then  @d=时间
                    when 'E' then  @e=时间
                    when 'F' then  @f=时间
                    when 'G' then  @g=时间
                    when 'H' then  @h=时间
                    when 'I' then  @i=时间
                    when 'J' then  @j=时间
                     
from a where a.ID=@n
                              
  while(true)--这个循环用来将T1表中相同案号的不同记录时间添加到同一条插入记录中
    begin
    @n=@n+1
     if(select 案号 from a where ID=@n)=@anhao
       begin
        select case 工作模块
                    when 'A' then  @a=时间
                    when 'B' then  @b=时间
                    when 'C' then  @c=时间
                    when 'D' then  @d=时间
                    when 'E' then  @e=时间
                    when 'F' then  @f=时间
                    when 'G' then  @g=时间
                    when 'H' then  @h=时间
                    when 'I' then  @i=时间
                    when 'J' then  @j=时间
                     
                     from a where a.ID=@n
       end
    else
      
        break
    end
insert into T2
values(@anhao,@a,@b,@c,@d,@e,@f,@g,@h,@i,@j)

end
drop table a
#5
aei1352010-11-02 11:54
INSERT INTO T2
SELECT 案号,
    SUM(CASE WHEN 工作模块='A' THEN 时间 ELSE 0 END) A,
    SUM(CASE WHEN 工作模块='B' THEN 时间 ELSE 0 END) B,
    SUM(CASE WHEN 工作模块='C' THEN 时间 ELSE 0 END) C,
    SUM(CASE WHEN 工作模块='D' THEN 时间 ELSE 0 END) D,
    SUM(CASE WHEN 工作模块='E' THEN 时间 ELSE 0 END) E,
    SUM(CASE WHEN 工作模块='F' THEN 时间 ELSE 0 END) F,
    SUM(CASE WHEN 工作模块='G' THEN 时间 ELSE 0 END) G,
    SUM(CASE WHEN 工作模块='H' THEN 时间 ELSE 0 END) H,
    SUM(CASE WHEN 工作模块='I' THEN 时间 ELSE 0 END) I,
    SUM(CASE WHEN 工作模块='J' THEN 时间 ELSE 0 END) J
FROM T1
GROUP BY 案号
#6
pumbaax102010-11-02 13:37
用curosr逐笔insert

代码如下:栏位名称自己再改下,类型如果有不对的话自己再cast转下。
Declare @aa as varchar(10)
Declare @bb as varchar(10)
Declare @cc as varchar(10)
Declare @sql_insert as nvarchar(1024)

Declare T1_cursor Cursor for
    select aa,bb,cc from T1 order by aa

Open T1_cursor
fetch next from T1_cursor into @aa,@bb,@cc

While (@@fetch_status<>-1)
Begin
    select aa from T2 where aa = @aa
    if(@@rowcount=0)
        insert into T2 (aa) values (@aa)
    set @sql_insert = 'update T2 set ' + @bb +' = '+@cc+' where aa = '+@aa


    fetch next from T1_cursor into @aa,@bb,@cc

End
close T1_cursor
deallocate T1_cursor
#7
欲与天斗2010-11-05 12:58
没想到刚进来就看到这么多人回复
1