注册 登录
编程论坛 SQL Server论坛

[求助] 多表连接与查询

zkqbp 发布于 2007-07-07 09:11, 2300 次点击

请高手指点

有二个数据表,一个表包括日期和收入金额,另一个表包括日期和支出金额,二个表的日期不完全相同。希望得到每个日期的余额,即余额=收入金额-支出金额。在计算余额前要用SUM函数和GROUP语句分别计算收入金额和支出金额,因为每个日期可能不止一笔帐。

二表如下:

A表 B表
日期 收入金额 日期 支出金额
1 10 1 5
1 20 1 4
2 30 3 10
2 10

求每天余额,即余额=收入金额-支出金额

多谢了

[此贴子已经被作者于2007-7-7 10:28:51编辑过]

22 回复
#2
sky_yang_sky2007-07-07 16:32

select date1,sum(import) as import into #temp11 from a group by date1
select date1,sum(export) as export into #temp22 from b group by date1
select a.date1 as date1,sum(import-export) from #temp11 a left join #temp22 b on a.date1=b.date1 group by a.date1
這個比較繁,但是功能還是能達到。

#3
zkqbp2007-07-08 09:53
多谢 sky_yang_sky 的 指点 我还有几个问题请帮助:

1。我用的 是Access数据库,用 # 建立临时数据库,编译通不过,不用# 建立的数据库是永久性的。
2。由于数据表B没有日期2,表A的收入金额是否会减 NULL 值? 如是,怎样处理? 我曾用过ISNULL函数,运行时
总出现参数个数不够的提示。
3。由于数据表A没有日期3,用left join 是否会日期3的数据无法统计?

再次多谢了
#4
liuzhe2007-07-10 16:39
2楼的那种算法日期3是在查询结果中是没有的吧
#5
liuzhe2007-07-10 17:26
要想把3也显示出来 用full join好了  
#6
sky_yang_sky2007-07-10 17:32

2。由于数据表B没有日期2,表A的收入金额是否会减 NULL 值? 如是,怎样处理? 我曾用过ISNULL函数,运行时
总出现参数个数不够的提示。
3。由于数据表A没有日期3,用left join 是否会日期3的数据无法统计?
的確如樓主所說的,那就改一下就可以,超出蕩圍領的話就成負
select isnull(a.day1,b.day1) as day1, sum(isnull(import,0)-isnull(export,0)) from #temp11 a full join #temp22 b on a.day1=b.day1 group by a.day1,b.day1
1。我用的 是Access数据库,用 # 建立临时数据库,编译通不过,不用# 建立的数据库是永久性的。
我只偶爾用ACCESS,但不熟悉,我想你可以先建表再刪就行了

#7
sky_yang_sky2007-07-11 08:28
to zkqbp
鐘對你前面提出的三個問題,我將語句改為如下,應該不會存在你所說的問題了
select isnull(a.day1,b.day1) as day1,sum(isnull(import,0)-isnull(export,0)) as remain from (select day1,sum(import)as import from a group by day1) a full join (select day1,sum(export) as export from b group by day1) b on a.day1=b.day1 group by a.day1,b.day1
#8
zkqbp2007-07-12 09:42
回复:(sky_yang_sky)to zkqbp鐘對你前面提出的三個...
sky_yang_sky:
我用你给的程序,编译总无法通过,信息是“未指定的错误”。
select isnull(a.day1,b.day1) as day1,sum(isnull(import,0)-isnull(export,0)) as remain from (select day1,sum(import)as import from a group by day1) a full join (select day1,sum(export) as export from b group by day1) b on a.day1=b.day1 group by a.day1,b.day1

其中 红色的a b 我不明白。你的语句中所有a b 都是分别指二个数据表名?
#9
sky_yang_sky2007-07-12 11:24

你在什麼上面執行的,我是MSSQL上的。這兒的a,b分別是我給(select day1,sum(import)as import from a group by day1),(select day1,sum(export) as export from b group by day1)命的別名如已,也可換成別的,只要相應欄位對應就行了。

#10
sky_yang_sky2007-07-12 11:32
day1 remain
2 40
1 21
3 -10
以上是我以你的數據執行的結果
#11
棉花糖ONE2007-07-12 13:28
楼主最好去把inner join,left join,right join,full join先弄懂下
#12
心中有剑2007-07-13 12:32
select isnull(a.date1, b.date1) as 日期,
sum(isnull(import, 0) - isnull(export, 0)) as 金额
from a
full join b on a.date1 = b.date1
group by a.date1, b.date1
order by 日期
#13
zkqbp2007-07-13 14:54
至 sky_yang_sky 及 心中有剑

首先感谢你们大量的帮助。用你们的程序,编译总无法通过,信息是“未指定的错误”。
我用C++Builder作为程序语言,Access作为数据库。C++Builder应支持MSSQL的。我在此程序中所做的其它许多数据库查询都可以顺利执行,这个却总编译通不过,真的不知道为什么??
#14
sky_yang_sky2007-07-13 15:13
to zkqbp
具體為什麼這個語句在你機子上執行不行我也不太清楚。
to 心中有剑
你這個語句的確很精簡,但是由於是full join,由於date1有重復值,這樣會導致數據重復的相加相減,導致數據不正確
#15
Deyee2007-07-13 17:17

select a.日期,sum(a.收入金额-b.支出金额) 余额
from A表 a,B表 b
where a.日期=b.日期
group by a.日期

#16
zkqbp2007-07-14 12:40
tO sky_yang_sky:

我又试过了,如果用full join 执行时会出现“未指定的错误”信息,如果用leff join 会出现“不支持此连接方法”信息。可能是我的access有问题。你能否帮我编一个用子查询方法的SQL语句???
#17
zkqbp2007-07-14 12:45
tO sky_yang_sky:

我又试过了,如果用full join 执行时会出现“未指定的错误”信息,如果用leff join 会出现“不支持此连接方法”信息。可能是我的access有问题。你能否帮我编一个用子查询方法的SQL语句???
#18
zkqbp2007-07-14 12:47
回复:(zkqbp)tO sky_yang_sky:[em17] 我又试过...
tO sky_yang_sky:

我又试过了,如果用full join 执行时会出现“未指定的错误”信息,如果用leff join 会出现“不支持此连接方法”信息。可能是我的access有问题。你能否帮我编一个用子查询方法的SQL语句???
#19
棉花糖ONE2007-07-16 14:50
leff join ,你这是单词拼写错了
#20
sky_yang_sky2007-07-16 15:47
to:zkqbp,不好意思,最近較忙
select isnull(a.day1,b.day1) as day1,sum(isnull(import,0)-isnull(export,0)) as remain from (select day1,sum(import)as import from a group by day1) a full join (select day1,sum(export) as export from b group by day1) b on a.day1=b.day1 group by a.day1,b.day1 order by day1
你自己再試試吧,這個語句在我機子上執行是沒問題的
#21
zkqbp2007-07-17 07:40
to sky_yang_sky:

多谢你能抽出宝贵时间帮我编写程序。
你给我的语句在我的计算机上我发运行:
1。isnull()函数通不过。
2。full join 通不过。

你能否帮我编一个子查询的语句??万分感谢!!!
#22
zkqbp2007-07-17 07:51
to Deyee
感谢你帮我编写程序。

你写给我的句子在我的计算机上能够执行,但不能完全达到我得目的:

如A表B表的日期不一样,则不一样日期的数据会丢失。
#23
lzalibabalr2007-08-01 11:14

DECLARE @tbl_a TABLE(dt DATETIME, income DECIMAL(5,2))
INSERT INTO @tbl_a SELECT '2007-05-12',10
UNION ALL SELECT '2007-05-12',20
UNION ALL SELECT '2007-05-12',10
UNION ALL SELECT '2007-08-20',30
UNION ALL SELECT '2007-08-20',30
UNION ALL SELECT '2007-09-17',10
UNION ALL SELECT '2007-11-16',10

DECLARE @tbl_b TABLE(dt DATETIME, payout DECIMAL(5,2))
INSERT INTO @tbl_b SELECT '2007-05-12',5
UNION ALL SELECT '2007-05-12',4
UNION ALL SELECT '2007-06-19',10
UNION ALL SELECT '2007-08-20',7
UNION ALL SELECT '2007-08-20',9
UNION ALL SELECT '2007-09-17',18
UNION ALL SELECT '2007-03-15',11

SELECT CONVERT(VARCHAR(10),ISNULL(t1.dt,t2.dt),120) '每日日期',
ISNULL(每日收入额,0)-ISNULL(每日支出额,0) AS '余额'
FROM (SELECT dt,SUM(income) AS '每日收入额'
FROM @tbl_a
GROUP BY dt) AS t1
FULL OUTER JOIN
(SELECT dt,SUM(payout) AS '每日支出额'
FROM @tbl_b
GROUP BY dt) AS t2
ON t1.dt=t2.dt

1