亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

行列轉換,交叉表 (統計用,支持動態類別的SQL)

2024-07-21 02:45:21
字體:
來源:轉載
供稿:網友

這段時間在看SAAS方面的書籍時發現一個關于數據處理的問題。里面講到一種擴展性非常好的方法。但一直到今天終于在網上找到了。只可惜現在還在探索,只是找到一個例子而已。我在這里把共享希望對大家有用。下面的語句在sql server 2005中我測試過沒有問題。

1: 列轉為行:
eg1:
Create table test (name char(10),km char(10),cj int)
go
insert test values('張三','語文',80)
insert test values('張三','數學',86)
insert test values('張三','英語',75)
insert test values('李四','語文',78)
insert test values('李四','數學',85)
insert test values('李四','英語',78)
想變成
姓名      語文      數學      英語
張三      80        86        75
李四      78        85        78

declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)
drop table test
eg2:
有表A,
id pid
1      1
1      2
1      3
2      1
2      2
3      1
如何化成表B:
id pid
     1     1,2,3
     2     1,2
     3     1
或者是從表B變成A(不要用游標)
以前有相似的列子,現在找不到了,幫幫忙!

--1.創建一個合并的函數
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+cast(pid as varchar) from 表A where id=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go
--調用自定義函數得到結果
select distinct id,dbo.fmerg(id) from 表A

2:
/***********        行轉列      *****************/
測試:
create table t1 (a int,b int,c int,d int,e int,f int,g int,h int)
insert t1 values(15, 9, 1, 0, 1, 2, 2, 0)
declare @ varchar(8000)
set @=''
select @=@+rtrim(name)+' from t1 union all select ' from syscolumns where id=object_id('t1')
set @=left(@,len(@)-len(' from t1 union all select '))
--PRint @
exec('select '+@+' from t1')
a          
-----------
15
9
1
0
1
2
2
0
===============================================================================
                以下個帶出的問題:
===============================================================================


3.將結果矩陣轉置
if      exists      (select      *      from      sysobjects      where      id      =      object_id('proc_sky_blue')      and      xtype      ='P')
drop      proc      proc_sky_blue
go
create      proc      proc_sky_blue      (@tablename      varchar(200))
as
begin
       set      nocount      on
       declare      @col      nvarchar(256)
       declare      @makesql      nvarchar(4000)
       declare      @insertsql      nvarchar(4000)
       declare      @caculatesql      nvarchar(400)
       declare      @count      int
       declare      @i      int
       create      table      #tmp      (colname      nvarchar(20))
       select      @caculatesql      =      'select      @count=count(1)      from      '      +      @tablename
       exec      sp_executesql      @caculatesql,      N'@count      int      output',@count      output
       if      @count      >=1024
       begin
           raiserror('表的行數太多了,我轉不了',16,1)
       end
       else
       begin
           select      @i=0
           while      @count      >0
           begin
               select      @i=@i+1
               select      @makesql      =      'alter      table      #tmp      add      col'+convert(varchar(20),@i)+'      int'
               exec(@makesql)
               select      @count=@count-1        
           end
           declare      my_cursor      cursor      for  
           select      name      from      syscolumns      where      id=object_id(@tablename)      order      by      colid
           open      my_cursor
           fetch      next      from      my_cursor      into      @col
           while      @@fetch_status      =      0
           begin
               select      @makesql      ='select      @insertsql=      @insertsql      +      convert(varchar(4),'+@col+')      +'',''      from      '      +@tablename
               select      @insertsql      =N'insert      #tmp      values      ('''+@col+      ''','
               execute      sp_executesql      @makesql,N'@insertsql      nvarchar(4000)      output'      ,@insertsql      output
               select      @insertsql      =      left(@insertsql,len(@insertsql)-1)      +')'
               exec(@insertsql)
               fetch      next      from      my_cursor      into      @col
           end
           close      my_cursor
           deallocate      my_cursor
           select      *      from      #tmp
           set      nocount      off
       end
end

go
----------------分析
declare      @tablename      varchar(200)
set      @tablename='table1'
begin
       set      nocount      on
       declare      @col      nvarchar(256)
       declare      @makesql      nvarchar(4000)
       declare      @insertsql      nvarchar(4000)
       declare      @caculatesql      nvarchar(400)
       declare      @count      int
       declare      @i      int
       create      table      #tmp      (colname      nvarchar(20))
       select      @caculatesql      =      'select      @count=count(1)      from      '      +      @tablename
       exec      sp_executesql      @caculatesql,      N'@count      int      output',@count      output
       if      @count      >=1024
       begin
           raiserror('表的行數太多了,我轉不了',16,1)
       end
       else
       begin
           select      @i=0
           while      @count      >0
           begin
               select      @i=@i+1
               select      @makesql      =      'alter      table      #tmp      add      col'+convert(varchar(20),@i)+'      int'
               exec(@makesql)
               select      @count=@count-1        
           end
           declare      my_cursor      cursor      for  
           select      name      from      syscolumns      where      id=object_id(@tablename)      order      by      colid
           open      my_cursor
           fetch      next      from      my_cursor      into      @col
           while      @@fetch_status      =      0
           begin
               select      @makesql      ='select      @insertsql=      @insertsql      +      convert(varchar(4),'+@col+')      +'',''      from      '      +@tablename
               select      @insertsql      =N'insert      #tmp      values      ('''+@col+      ''','
               execute      sp_executesql      @makesql,N'@insertsql      nvarchar(4000)      output'      ,@insertsql      output
               select      @insertsql      =      left(@insertsql,len(@insertsql)-1)      +')'
               select      @insertsql
               --exec(@insertsql)
               fetch      next      from      my_cursor      into      @col
           end
           close      my_cursor
           deallocate      my_cursor
           select      *      from      #tmp
           set      nocount      off
           drop      table      #tmp


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲码在线观看| 日本亚洲欧美成人| 欧美电影在线播放| 精品中文字幕久久久久久| 日韩在线资源网| 性欧美亚洲xxxx乳在线观看| 国产精品美女主播在线观看纯欲| www.日本久久久久com.| 亚洲国产精品美女| 九九精品在线播放| 91在线精品视频| 色噜噜久久综合伊人一本| 亚洲国产精品va在看黑人| 狠狠做深爱婷婷久久综合一区| 色久欧美在线视频观看| 国产精品99久久久久久白浆小说| 亚洲风情亚aⅴ在线发布| 黄色精品在线看| 热久久视久久精品18亚洲精品| 高清欧美电影在线| 欧美日韩国产黄| 成人欧美一区二区三区在线湿哒哒| 日韩av片电影专区| 日韩欧美高清视频| 日韩在线视频观看正片免费网站| 日韩中文字幕精品| 亚洲国产成人久久| 欧美日韩一区二区免费在线观看| 欧美另类精品xxxx孕妇| 欧美性资源免费| 国产欧美中文字幕| 精品成人国产在线观看男人呻吟| 亚洲石原莉奈一区二区在线观看| 国产欧美婷婷中文| 97精品国产91久久久久久| 国产国产精品人在线视| 亚洲无av在线中文字幕| 欧美一区三区三区高中清蜜桃| 国产精品视频免费在线观看| 亚洲第一av网| 亚洲国产高清自拍| 国产精品美女久久| 日韩av免费在线播放| 日韩美女视频免费看| 久久久久久亚洲精品| 国产成人aa精品一区在线播放| 懂色av一区二区三区| 社区色欧美激情 | 91日本视频在线| 久久久久久九九九| 蜜臀久久99精品久久久久久宅男| 国产成人aa精品一区在线播放| 一区二区亚洲精品国产| 久久久久久久久久国产精品| 中文字幕日韩高清| 中文字幕亚洲精品| 日韩高清av在线| 亚洲欧美日韩直播| 色视频www在线播放国产成人| 国产精品久久久久久久美男| 久久人人看视频| 亚洲欧美精品一区| 91经典在线视频| 日韩欧美极品在线观看| 亚洲欧美日韩国产成人| 欧美成人免费观看| 国产综合久久久久久| 亚洲精品免费在线视频| 懂色aⅴ精品一区二区三区蜜月| 久久99视频免费| 97在线日本国产| 欧美在线不卡区| 国产成人精品国内自产拍免费看| www.日韩免费| 91欧美精品成人综合在线观看| 国产精品∨欧美精品v日韩精品| 亚洲天天在线日亚洲洲精| 欧美国产日本高清在线| 国产视频久久久| 亚洲老板91色精品久久| 欧美精品18videos性欧美| 日韩小视频网址| 在线精品国产欧美| 国产精品美女无圣光视频| 青青青国产精品一区二区| 国内揄拍国内精品| 亚洲黄页网在线观看| 欧美精品成人91久久久久久久| 国产精品日韩电影| 日韩中文字幕网| 国产精品久久久久久久久借妻| 欧美视频在线观看免费| 国产精品视频色| 91美女福利视频高清| 国产亚洲美女精品久久久| 久久久亚洲精品视频| 亚洲一区二区三区乱码aⅴ| 中文字幕日韩欧美| 日韩欧美国产免费播放| 欧美另类99xxxxx| 欧美亚洲国产日本| 欧美不卡视频一区发布| 国产亚洲激情视频在线| 亚洲的天堂在线中文字幕| 欧美噜噜久久久xxx| 亚洲自拍欧美另类| 97久久精品视频| 国产精品最新在线观看| 亚洲最大成人网色| 欧美日韩国产成人在线| 91老司机精品视频| 粗暴蹂躏中文一区二区三区| 国产热re99久久6国产精品| 97超级碰碰人国产在线观看| 久久久久久成人| 欧美一区二区三区四区在线| 日本精品视频在线播放| 国产精品www| 亚洲精品黄网在线观看| www.日韩视频| 久久手机免费视频| 国产精品久久久久久久久粉嫩av| 中文字幕日韩高清| 久久久久久久久久久人体| 国产精品久久久久久久久粉嫩av| 欧美国产日韩视频| 欧美精品videofree1080p| 色偷偷av亚洲男人的天堂| 亚洲人成亚洲人成在线观看| 亚洲wwwav| 国产精品久久久久久久久久久新郎| 日韩视频免费观看| 欧美性xxxx极品高清hd直播| 国产精品黄页免费高清在线观看| 亚洲韩国青草视频| 成人黄色免费在线观看| 久久99久久99精品中文字幕| 欧美成人午夜剧场免费观看| 色噜噜狠狠狠综合曰曰曰88av| 成人午夜黄色影院| 日韩中文字幕在线免费观看| 国产成人av网址| 26uuu另类亚洲欧美日本老年| 在线一区二区日韩| 日韩欧美国产黄色| 日韩精品在线第一页| 亚洲自拍偷拍区| 456亚洲影院| 国产精品一区二区三区久久| 色综合久久88色综合天天看泰| 97视频色精品| 最近中文字幕mv在线一区二区三区四区| 欧美极品欧美精品欧美视频| 91精品国产沙发| 国产精品三级在线| 久久99热精品这里久久精品| 91精品91久久久久久| 日韩电影免费观看中文字幕| 日韩美女在线观看| 人人澡人人澡人人看欧美| 精品国产户外野外| 日本成人在线视频网址| 亚洲国内精品在线| 日韩在线观看网址|