动态SQL的使用例子, 行列转换.

drop   table  #test
create   table  #test(name   nvarchar ( 20 ),type   nvarchar ( 20 ),category   nvarchar ( 20 ))
select   *   from  #test
insert   into  #test(name,type,category)  values  ( ' n1 ' , ' t1 ' , ' c1 ' );
insert   into  #test(name,type,category)  values  ( ' n2 ' , ' t1 ' , ' c2 ' );
insert   into  #test(name,type,category)  values  ( ' n3 ' , ' t2 ' , ' c1 ' );
insert   into  #test(name,type,category)  values  ( ' n4 ' , ' t3 ' , ' c3 ' );
insert   into  #test(name,type,category)  values  ( ' n5 ' , ' t2 ' , ' c4 ' );
insert   into  #test(name,type,category)  values  ( ' n6 ' , ' t3 ' , ' c5 ' );
insert   into  #test(name,type,category)  values  ( ' n1 ' , ' t1 ' , ' c1 ' );

-- select category,name,sum(case when type='t1' then 1 else 0 end),sum(case when type='t2' then 1 else 0 end),sum(case when type='t3' then 1 else 0 end) from #test group by name,category
--
如果type不固定
--
使用動態SQL語句 
Declare   @S   Varchar ( 8000 )
Select   @S   =   ' Select     category, name '
Select   @S   =   @S   +   ' , SUM(Case type When  '''   +  type  +   '''  Then 1 Else 0 End) As  '   +  type
From  #TEST  Group   By  type
Select   @S   =   @S   +   '  From #TEST Group By category, name Order By category, name '
print   @S
EXEC ( @S )
GO

 

 

-- 测试数据   行转列
   Create     table    test   (name    char ( 10 ),km    char ( 10 ),cj    int )   
  
insert    test    values ( ' 张三 ' , ' 语文 ' , 80 )   
  
insert    test    values ( ' 张三 ' , ' 数学 ' , 86 )   
  
insert    test    values ( ' 张三 ' , ' 英语 ' , 75 )   
  
insert    test    values ( ' 李四 ' , ' 语文 ' , 78 )   
  
insert    test    values ( ' 李四 ' , ' 数学 ' , 85 )   
  
insert    test    values ( ' 李四 ' , ' 英语 ' , 77 )   
    
  
-- 查询   
   declare     @sql     varchar ( 8000 ), @s1     varchar ( 8000 )   
  
select     @sql     =     '' , @s1 = ''    
    
  
select     @sql     =     @sql +     ' ,[ ' + km + ' ]=sum(case   km   when    ''' + km + '''    then   cj   else   0   end) '    
  ,
@s1 = @s1 + ' ,sum(case   km   when    ''' + km + '''    then   cj   else   0   end)/sum(case   km   when    ''' + km + '''    then   1   else   0   end) '    
  
from    test     
  
group     by    km   
  
exec ( ' select   name=case   grouping(name)   when   1   then    '' 全班总分 ''    else   name   end ' + @sql + ' ,小计=sum(cj)   
  from   test   
  group   by   name   with   rollup   
  union   all   
  select   
'' 全班平均分 ''' + @s1 + ' ,sum(cj)/count(distinct   name)   
  from   test
' )   
  
go    
    
  
-- 删除测试   
   drop     table    test   


 

-- MS SQL2000下月份不固定的動態寫法
Create   Table  TEST
(class    
Nvarchar ( 10 ),
 name    
Nvarchar ( 10 ),
 年份    
Int ,
 
[ 1月 ]          Varchar ( 10 ),
 
[ 2月 ]          Varchar ( 10 ),
 
[ 3月 ]          Varchar ( 10 ))
Insert  TEST  Select  N ' 一班 ' ,N ' 张三 ' , 2007 , ' 5元 ' , ' 2元 ' , ' 5元 '
Union   All   Select  N ' 一班 ' ,N ' 李四 ' , 2006 , ' 3元 ' , ' 0元 ' , ' 1元 '
Union   All   Select  N ' 二班 ' ,N ' 王五 ' , 2007 , ' 0元 ' , ' 0元 ' , ' 1元 '
GO
Declare   @S   Nvarchar ( 4000 )
Select   @S   =   ''
Select   @S   =   @S   +   '  Union Select class, name, 年份,  '''   +  Name  +   '''  As 月份, [ '   +  Name  +   ' ] As 元  From TEST  '  
From  SysColumns  Where  ID  =   OBJECT_ID ( ' TEST ' And  Name  Like   ' %月 '   Order   By  Name
Select   @S   =   Stuff ( @S 1 7 '' )
Print   @S
EXEC ( @S )
GO
Drop   Table  TEST

 

-- 动态月份2005 处理如下:
--
测试环境
create   table  tb_tb(class  varchar ( 10 ),name  varchar ( 10 ),年份  varchar ( 10 ), [ 1月 ]   varchar ( 10 ), [ 2月 ]   varchar ( 10 ), [ 3月 ]   varchar ( 10 ))
insert   into  tb_tb  select   ' 一班 ' , ' 张三 ' , ' 2007 ' , ' 5元 ' , ' 2元 ' , ' 5元 '
union   all   select   ' 一班 ' , ' 李四 ' , ' 2006 ' , ' 3元 ' , ' 0元 ' , ' 1元 '
union   all   select   ' 二班 ' , ' 王五 ' , ' 2007 ' , ' 0元 ' , ' 0元 ' , ' 1元 '
-- 计算月份:
declare   @月份   varchar ( 100 )
set   @月份 = '' ;
select   @月份 = @月份 + ' ,[ ' + name + ' ] '   from  sys.columns  where   object_id = object_id ( ' tb_tb ' )
and  name  like   ' %月 '
set    @月份 = stuff ( @月份 , 1 , 1 , '' )
-- 交叉表处理
exec ( '
select * from tb_tb
unpivot
    ( 金额 for 月份 in (
' + @月份 + ' )
) unpt
where 金额<>
'' 0元 ''
' )
-- 删除测试环境
drop   table  tb_tb

 

 

-- 建立測試環境
Create   Table  表1
(
[ id ]      Int ,
 
[ 名称 ]      Nvarchar ( 20 ))
Insert  表1  Select   1 ,       N ' 名称1 '
Union   All   Select   2 ,       N ' 名称2 '
Union   All   Select   3 ,       N ' 名称3 '

Create   Table  表2
(
[ id ]          Int ,
 
[ 时间 ]      Nvarchar ( 10 ),
 
[ 地点 ]      Nvarchar ( 10 ))
Insert  表2  Select   1 ,          N ' 5日 ' ,        N ' 上海 '
Union   All   Select   1 ,          N ' 9日 ' ,        N ' 北京 '
Union   All   Select   1 ,          N ' 20日 ' ,      N ' 天津 '
Union   All   Select   2 ,          N ' 8日 ' ,        N ' 杭州 '
Union   All   Select   2 ,          N ' 19日 ' ,       N ' 广州 '
Union   All   Select   3 ,          N ' 8日 ' ,        N ' 深圳 '
GO
-- 創建函數
Create   Function  F_TEST( @id   Int )
ReturnS   Nvarchar ( 4000 )
As
Begin
    
Declare   @S   Nvarchar ( 4000 )
    
Select   @S   =   ''
    
Select   @S   =   @S   +   ' ; '   +  时间  +   ' - '   +  地点  From  表2  Where  id  =   @id
    
Select   @S   =   Stuff ( @S 1 1 '' )
    
Return   @S
End
GO
-- 測試
Select
    id,
    dbo.F_TEST(id) 
As   [ 时间、地点 ]
From
    表1
GO
-- 刪除測試環境
Drop   Table  表1, 表2
Drop   Function  F_TEST
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值