如何写SQL? 300分!!!(300分)

  • 主题发起人 主题发起人 sallun
  • 开始时间 开始时间
S

sallun

Unregistered / Unconfirmed
GUEST, unregistred user!
我有这样两个表:(为了清楚,字段我就用中文)
表1
姓名 身份证号码 街道
A 1234 aa
B 4321 bb
表2
身份证号码 救助金额 救助作用
1234 500 生活救助
1234 200 助学救助
1234 1000 医疗救助
4321 200 生活救助
4321 400 助学救助
4321 600 医疗救助
两个表通过“身份证号码”连接,现在要生成这样一个报表:
街道 救助人数 生活救助 助学救助 医疗救助 总救助金额
... ... ... ... ... ...
按街道统计,分别统计用于不同作用的救助金额(合计),请那位大虾不吝赐教!
 
我的笨方法:

query1中:select (distinct 街道) as 街道 from 表1
之后,
query2中:select count(救助人数) as 救助人数 from 表1 where 街道=:pp
pp分别用query1中的街道代替。

query3中:select count(表2.救助金额)as 生活补助 from 表1,表2 where 街道:=pp and 表1.身份证号码=表2。身份证号码 and 救助作用=生活补助
...
之后,将结果全部存入报表连接的数据库。
ok?
 
我想知道用一个SQL怎么写.
 
你能不能写出你想得到这个报表的结果(数据)是什么?我看了半天,不知道你想得到什
么结果。
 
以下是每人每项求助只做一次的SQL:

select A.街道,'救助人数'=count(*),B.生活救助,B.助学救助,B.医疗救助,'总救助金额'=sum(B.救助金额)
from 表1 A,表2 B
where A.身份证号码=B.身份证号码


以下是每人每项求助可做n次的SQL:

select A.街道,'救助人数'=count(*),'生活救助'=sum(B.生活救助),'助学救助'=sum(B.助学救助),'医疗救助'=sum(B.医疗救助),'总救助金额'=sum(B.救助金额)
from 表1 A,表2 B
where A.身份证号码=B.身份证号码

 
同意pxlei的方法
 
在DELPHI 5下用REPORT BUILDER 的 CROSSTABLE
 
select a.街道,
count(distinct b.身份证号码)
+ count(distinct c.身份证号码)
+ count(distinct d.身份证号码),
sum(b.救助金额),
sum(c.救助金额),
sum(d.救助金额),
sum(b.救助金额
+c.救助金额
+d.救助金额)
from 表1 a, 表2 b, 表2 c, 表2 d
where (b.身份证号码=a.身份证号码 and b.救助作用='生活救助')
and (c.身份证号码=a.身份证号码 and c.救助作用='助学救助')
and (d.身份证号码=a.身份证号码 and d.救助作用='医疗救助')
group by a.街道
 
痛心啊, 为什么我没有早看到这个问题:-(
完善一下:
select a.街道 as 街道,
count(distinct b.身份证号码)
+ count(distinct c.身份证号码)
+ count(distinct d.身份证号码) as 救助人数,
sum(b.救助金额) as 生活救助,
sum(c.救助金额) as 助学救助,
sum(d.救助金额) as 医疗救助,
sum(b.救助金额
+c.救助金额
+d.救助金额) as 总救助金额
from 表1 a, 表2 b, 表2 c, 表2 d
where (b.身份证号码=a.身份证号码 and b.救助作用='生活救助')
and (c.身份证号码=a.身份证号码 and c.救助作用='助学救助')
and (d.身份证号码=a.身份证号码 and d.救助作用='医疗救助')
group by a.街道
order by 街道
 
agree cytown.
 
Another_eYes,cytown:
有两个问题,现在这个SQL只能查出三种救助都有的人的记录,而实际上一个人可能只有一种或两种救助;另外,比如说一个人有三种救助各一次,救助人数应该是1而不是3。再帮帮忙!分数马上送上!
 
select e.街道,
count(*) as 救助人数,
sum(bprice) as 生活救助,
sum(cprice) as 助学救助,
sum(dprice) as 医疗救助,
sum(bprice) + sum(cprice) + sum(dprice) as 总救助金额

from 表1 e join
(select a.身份证号码,
isnull(sum(b.救助金额),0) as bprice,
isnull(sum(c.救助金额),0) as cprice,
isnull(sum(d.救助金额),0) as dprice
from 表1 a
left outer join 表2 b
on b.身份证号码=a.身份证号码 and b.救助作用='生活救助'
left outer join 表2 c
on c.身份证号码=a.身份证号码 and c.救助作用='助学救助'
left outer join 表2 d
on d.身份证号码=a.身份证号码 and d.救助作用='医疗救助'
group by a.身份证号码) f
on f.身份证号码=e.身份证号码
group by e.街道
order by 街道
 
Another_eYes,cytown两位大虾:
这种一句解决SQL的问题经常看见,有时的确感到困难.最近因为要优化一些SQL语句
仔细地看了一下HELP,发现Select * from的后面不一定是现有的表,完全可以用
select的一个数据集来替代,所以语句可以写成这样,不知是否妥当,还请两位大虾指教.
select a.街道, sum(b.人次+c.人次+d.人次) as 人次,b.救助金额 as 生活救助,
c.救助金额 as 助学救助,d.救助金额 as 医疗救助,sum(b.救助金额+c.救助金额+d.救助金额)
from 表1 a,
(select a.街道,count(b.*) as 人次,sum(b.救助金额) from 表1 a, 表2 b
where a.身份证号码=b.身份证号码 and b.救助作用='生活救助' group by a.街道) as b,
(select a.街道,count(b.*) as 人次,sum(b.救助金额) from 表1 a, 表2 b
where a.身份证号码=b.身份证号码 and b.救助作用='助学救助' group by a.街道) as c,
(select a.街道,count(b.*) as 人次,sum(b.救助金额) from 表1 a, 表2 b
where a.身份证号码=b.身份证号码 and b.救助作用='医疗救助' group by a.街道) as d
where a.街道=b.街道
and a.街道=c.街道
and a.街道=d.街道
group by a.街道,b.救助金额,c.救助金额,d.救助金额
以上语句没测试,可能会有些错,提供一个思路.
 
DELPHI好象不支持select的嵌套,怎么办?
 
呵呵, 你的语句没时间试, 不过, 看来人次是重复了.
我提供的语句肯定没问题:-)

sallun, 如果不支持套欠, 可以用view/sp代替.
 
cytown:
我试过你的SQL了,有错,invild use of keyword token: select
line Number:8 好象DELPHI是不支持select的这种用法,另外,view/sp是
什么?
 
delphi支持嵌套sql, 但是ansi sql 92标准里是不支持select ... from (select...)的
恕在下孤陋寡闻, 不知道哪种数据库支持这样的用法?
(我只用过ms sql server).
bde是通过一个变通的办法实现select from select的.
bde解释sql时select from 可以是一个.QBE文件或者是个.SQL文件.
而.SQL就是一个文本文件, 包含一句sql语句.
这也是我喜欢BDE不喜欢ODBC的原因之一.
 
cytown的语句没有毛病,但要看使什么数据库,我用SQL SERVER 测试通过
 
select a.街道, count(b.ID) as 人次,c.金额,
d.金额 as 助学救助,e.金额 as 医疗救助,sum(b.money) as 总金额
from 表1 a,表2 b,
(select a.街道,sum(b.救助金额) as 金额 from 表1 a,表2 b
where a.ID=b.ID and b.救助作用='生活救助' group by a.街道) as c,
(select a.街道,sum(b.救助金额) as 金额 from 表1 a,表2 b
where a.ID=b.ID and b.救助作用='助学救助' group by a.街道) as d,
(select a.街道,sum(b.救助金额) as 金额 from 表1 a,表2 b
where a.ID=b.ID and b.救助作用='医疗救助' group by a.街道) as e
where a.id=b.id
and a.街道*=c.街道
and a.街道*=d.街道
and a.街道*=e.街道
group by a.街道,c.金额,d.金额,e.金额

以上语句在SQL Server7上测试通过。
因为模拟数据没用中文字段名,可能有些字段名与原来不一样。
再贴上原始代码。
select a.name, count(b.ID) as 人次,c.金额,
d.金额 as 助学救助,e.金额 as 医疗救助,sum(b.money) as 总金额
from basicdata a,detaildata b,
(select a.name,sum(b.money) as 金额 from basicdata a, detaildata b
where a.ID=b.ID and b.category='生活救助' group by a.name) as c,
(select a.name,sum(b.money) as 金额 from basicdata a, detaildata b
where a.ID=b.ID and b.category='助学救助' group by a.name) as d,
(select a.name,sum(b.money) as 金额 from basicdata a, detaildata b
where a.ID=b.ID and b.category='医疗救助' group by a.name) as e
where a.id=b.id
and a.name*=c.name
and a.name*=d.name
and a.name*=e.name
group by a.name,c.金额,d.金额,e.金额

 
Another_eYes
还在用SQL Server6.5吗?因为我已经没有6.5的环境了,所以不知道我所说的方法
在6.5下是不是可行.7.0的肯定可以.试一下就可以了.
再建模拟数据库时,又添加了几条特殊的数据,也没有问题.
 
后退
顶部