当前位置:编程学习 > C#/ASP.NET >>

前辈们帮帮忙,一个SQL语句问题

有如下表
工资帐套管理(tb_wageaccount)
字段名 类型 字段描述 约束
Accountid Int 序号 自增 唯一
accountName Varchar 帐套名称 无

中间表(tb_wagetoaccount)
字段名 类型 字段描述 约束
toId Int 序号 自增 唯一
Accountid Int 工资套账编号 无
Wageid Int 工资编号 无

工资项目表(tb_wage)
字段名 类型 字段描述 约束
Wageid Int 序号 自增 唯一
Wageitem Varchar 工资项目 无
InitialValue Price 初始值 无

工资管理表(tb_wagemanage)
字段名称 类型 字段描述 约束
Wmangeid Int 序号 自增 唯一
Accountid Int 工资帐套编号  无
WageTime Datetime 时间 无
Status Varchar 状态 默认值 N


工资子表(tb_SubWage)
字段名 类型 字段描述 约束
SubWageId Int 序号 自增 唯一
Num Int 员工编号 无
Wmageid Int 工资管理编号 无
Wageid Int 工资项目编号 无
InitialValue Price 工资初始值 无

员工档案表(tb_ Archives )
字段名 类型 字段描述 约束
Num Int 编号 必须是数字0001 自增 主键 
Name Varchar 姓名 无
Branchid Int 部门ID 无

部门表(tb_Branch)
字段名 类型 字段描述 约束
Branchid Int 序号 主键 自增 唯一
WpId Int 从属编号 默认0
Branch Varchar 部门名称 无

统计出 在时间范围内该部门的 每项工资

select b.branchid as 部门ID,count(a.num) as 人数, sw.wageid 工资项目ID,sum(sw.initialvalue) 项目工资统计
from tb_SubWage as sw,tb_wagemanage as wm , tb_Archives as a,tb_Branch as b
where wm.Wmangeid  = sw.wmageid 
and a.num = sw.num
and b.Branchid = a.BranchId
and wm.accountid = 1
and wm.wageTime = #2010-4-22#
and sw.wageid in
(
select w.wageid from tb_wageaccount as wc,tb_wagetoaccount as wt, tb_wage as w
where wc.accountid = wt.accountid
and w.wageid = wt.wageid
and wc.accountid = @id
)
group by sw.wageid,b.Branchid

统计结果如下

部门id   部门人数  工资项目ID  项目工资和
1        1          1          100
1        1          2          300
1        1          3          500
1        1          4          700

我需要的查询结果形式是

部门id  部门人数   工资项目ID1的工资和   工资项目ID2的工资和   工资项目ID3的工资和   工资项目ID4的工资和
1       1           100                   300                    500                   700

问题的关键在与工资套账ID下所属的工资项目不是固定的   工资项目可能是4个 也可能是5个  这效果该怎么实现

我用的是 Access2003

初来乍到 谢谢各位了 --------------------编程问答-------------------- 一个人整天闷闷的,都不知道怎么学习了,想多交点朋友,讨论下技术
c#技术组:108806769 --------------------编程问答--------------------

;with t as
{
select b.branchid as 部门ID,count(a.num) as 人数, sw.wageid 工资项目ID,sum(sw.initialvalue) 项目工资统计
from tb_SubWage as sw,tb_wagemanage as wm , tb_Archives as a,tb_Branch as b
where wm.Wmangeid = sw.wmageid  
and a.num = sw.num
and b.Branchid = a.BranchId
and wm.accountid = 1
and wm.wageTime = #2010-4-22#
and sw.wageid in
(
select w.wageid from tb_wageaccount as wc,tb_wagetoaccount as wt, tb_wage as w
where wc.accountid = wt.accountid
and w.wageid = wt.wageid
and wc.accountid = @id
)
group by sw.wageid,b.Branchid



select 部门id,部门人数,case 工资项目ID when 1 then 项目工资和 else null end as 工资项目ID1的工资和,case 工资项目ID when 2 then 项目工资和 else null end  as 工资项目ID2的工资和,case 工资项目ID when 3 then 项目工资和 else null end  as 工资项目ID3的工资和,case 工资项目ID when 4 then 项目工资和 else null end  as 工资项目ID4的工资和 from t



--------------------编程问答--------------------
引用 2 楼 sxiaohui8709253 的回复:
SQL code

;with t as
{
select b.branchid as 部门ID,count(a.num) as 人数, sw.wageid 工资项目ID,sum(sw.initialvalue) 项目工资统计
from tb_SubWage as sw,tb_wagemanage as wm , tb_Archives as a,tb_Branch as b
wher……

up --------------------编程问答-------------------- 小弟对SQL 理解不深
;with  case  when  then else end 等字眼有些晕   直接帖上去运行不了 说是 无效的SQL语句···
但是那个 工资项目ID的个数不是固定的 也许还有ID 6号   7号   8号····
写死肯定不行的 --------------------编程问答-------------------- 不写死 那就要拼接语句啊 去SQL板块求行转列的帖子
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,