首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL2000 SQL语句求解,

2013-01-11 
SQL2000 SQL语句求解,在线等。。。本帖最后由 w3k 于 2013-01-02 22:38:37 编辑收费项目表(tb_sfxm)项目编码

SQL2000 SQL语句求解,在线等。。。
本帖最后由 w3k 于 2013-01-02 22:38:37 编辑

收费项目表(tb_sfxm)
项目编码    名称      金额
001       交通费     500
002       生活补贴   500
003       通讯费     500
004       住房补贴   500
005       奖金       500
006       提成费     1000

人员参与信息表(tb_info)
收费项目编码  姓名  
001         张三    
002         张三    
003         张三 
004         张三 
005         张三 
001         李四
002         李四 
003         李四
004         李四
001         龙五
002         龙五
003         龙五

根据人员参与信息表对照收费项目表,需要动态生成如下格式:
 
姓名  交通费  生活补贴    通讯费     住房补贴     奖金   提成费  ……  小计
张三   500     500        500       500     500     0           2500 
李四   500     500        500       500      0      0           2000
龙五   500     500        500        0       0      0           1500

    
[解决办法]

if object_id('[tb_sfxm]') is not null drop table [tb_sfxm]
go
create table [tb_sfxm]([项目编码] varchar(3),[名称] varchar(8),[金额] int)
insert [tb_sfxm]
select '001','交通费',500 union all
select '002','生活补贴',500 union all
select '003','通讯费',500 union all
select '004','住房补贴',500 union all
select '005','奖金',500 union all
select '006','提成费',1000
go
if object_id('[tb_info]') is not null drop table [tb_info]
go
create table [tb_info]([收费项目编码] varchar(3),[姓名] varchar(4))
insert [tb_info]
select '001','张三' union all
select '002','张三' union all
select '003','张三' union all
select '004','张三' union all
select '005','张三' union all
select '001','李四' union all
select '002','李四' union all


select '003','李四' union all
select '004','李四' union all
select '001','龙五' union all
select '002','龙五' union all
select '003','龙五'
go

declare @sql varchar(8000)
select @sql=isnull(@sql+',','')
  +'sum(case when b.名称='''+名称+''' then b.金额 else 0 end) as ['+名称+']'
from
(select distinct 名称 from tb_sfxm) t

exec ('select a.姓名,'
  +@sql
  +',sum(b.金额) as 合计 from tb_info a join tb_sfxm b on a.收费项目编码=b.项目编码 group by a.姓名'
)

/**
姓名   奖金          交通费         生活补贴        提成费         通讯费         住房补贴        合计
---- ----------- ----------- ----------- ----------- ----------- ----------- -----------
李四   0           500         500         0           500         500         2000
龙五   0           500         500         0           500         0           1500
张三   500         500         500         0           500         500         2500

(3 行受影响)
**/


[解决办法]
动态sql就要一个变量,而且你的是2000,pivot又用不上
[解决办法]
静态SQL的写法如下:
select 
  a.姓名,
  sum(case when b.名称='交通费' then b.金额 else 0 end) as [交通费],
  sum(case when b.名称='生活补贴' then b.金额 else 0 end) as [生活补贴],
  sum(case when b.名称='通讯费' then b.金额 else 0 end) as [通讯费],
  sum(case when b.名称='住房补贴' then b.金额 else 0 end) as [住房补贴],
  sum(case when b.名称='奖金' then b.金额 else 0 end) as [奖金],
  sum(case when b.名称='提成费' then b.金额 else 0 end) as [提成费],
  sum(b.金额) as 合计 
from 
  tb_info a 
join 
  tb_sfxm b 
on 
  a.收费项目编码=b.项目编码 
group by 
  a.姓名

热点排行
Bad Request.