查询难题(100分)

  • 主题发起人 主题发起人 wangttop
  • 开始时间 开始时间
W

wangttop

Unregistered / Unconfirmed
GUEST, unregistred user!
各位老师:节日好!
我遇到一个查询难题:
条件:已建好了一个数据库(户口表.db)并录入了数据
编号 姓名 收费 收费日期
1 张三 60.00 01-1-28
2 李四 200.00 01-2-30
1 张三 100.00 01-2-30
......
要求:希望用dbgrid显示成强下格式
编号 姓名 一月收费 二月收费.....十二月收费 收费合计
1 张三 60.00 100.00 160.00
2 李四 200.00 200.00
我用SQL做过,太烦,有没有比较便捷的办法或用其他控件显示.我是初学者,望给出源码!!!
 
利用SELECT 语句就可以。
 
Select 编号,姓名,Sum([一月收费]) [一月收费],.......,sum([十二月收费]) [十二月收费], sum([收费合计]) [收费合计]
From ( Select 编号,姓名,case Mon=1 then [收费] else 0 end [一月收费],
case Mon=2 then [收费] else 0 end [二月收费],
............
case Mon=11 then [收费] else 0 end [十一月收费],
case Mon=12 then [收费] else 0 end [十二月收费],
[收费] [收费合计]
From (Select 编号,姓名,收费,Month(收费日期) Mon From 户口表.db) T
) TT Group By 编号,姓名


 
难道不能实现吗?望指教!
 
笨办法:
select 编号,姓名,
sum(case month(收费日期) when 1 then 收费 else 0 end) as 一月收费,
sum(case month(收费日期) when 2 then 收费 else 0 end) as 二月收费,
...
sum(case month(收费日期) when 12 then 收费 else 0 end) as 十二月收费,
sum(收费) as 收费合计
from 户口表.db
where year(收费日期) = 2001
group by 编号, 姓名
 
不知那位老师有高招?
 
dlnew 不是给出答案了吗.....
 
好象其他的方法不太可能,我是没有见过,不过上述的方法就可以了
 
各位老师:
我用的是Paradox本地数据库,以上方法试了,都不行,望赐教!
 
哈哈,paradox没有month() 和 year()两个函数,你只能用再笨一点的方法了!

select distinct a.编号,b.姓名,
sum(b.收费) as 一月收费,
sum(c.收费) as 二月收费,
...
sum(m.收费) as 十二月收费,
sum(a.收费) as 收费合计
from 户口表.db a
left join 户口表.db b on b.编号 = a.编号 and b.姓名 = a.姓名 and b.收费日期 >= '2001-01-01' and b.收费日期 < '2001-02-01'
left join 户口表.db c on b.编号 = a.编号 and c.姓名 = a.姓名 and c.收费日期 >= '2001-02-01' and c.收费日期 < '2001-03-01'
...
left join 户口表.db m on m.编号 = a.编号 and m.姓名 = a.姓名 and m.收费日期 >= '2001-12-01' and m.收费日期 < '2002-01-01'
where a.收费日期 >= '2001-01-01' and a.收费日期 < '2002-01-01'
group by 编号, 姓名

([gold]未经调试,如有错误,概不负责![/gold][:D])
 
感谢dlnew先生的热情,先将分送你了,等我试了,再向你请教.
 
to dlnew:
我用你给的程序试了,结果:对同一个姓名,若有2次收费,每月结果都扩大了2倍,3次就扩大3倍。
即:
编号 姓名 一月收费 二月收费.....十二月收费 收费合计
1 张三 120(60) 200(100) 320(160)
2 李四 200.00 200.00
注:括号内为正确数。
这是什么原因?特请教。
 
真不好意思,本人出差去了(一个鸟不生蛋鸡不叫的地方!),刚回来!
我已试过了,的确不能这样做。建议使用临时表的方法。

如果在数据录入时,对“编号”采取点措施,可能会好些。

另外,“编号”字段似乎没有启到作用!
 
后退
顶部