请教sql高手select语句如何写!高手都来吧!(100分)

  • 主题发起人 mike_tan
  • 开始时间
M

mike_tan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在开发一个DELPHI+sybase的程序,sybase只开放只读:
请问以下的select语句如何写:
请高手耐心看完
数据库1 (记录不存在重复)
机构 日期 货币代码 金额1
1 20020531 14 1
1 20020531 13 1
2 20020531 1 1
2 20020431 13 1
3 20020331 14 1
2 20020331 14 1
3 20020331 13 1
3 20020531 13 1
3 20020331 1 1
4 20020131 13 1

数据库2 (记录不存在重复)
机构 日期 货币代码 金额2
2 20020531 14 2
1 20020531 1 2
2 20020431 13 2
3 20020331 14 2
3 20020331 13 2
2 20020331 1 2
3 20020131 1 2

数据库3
货币代码 货币 汇率
01 人民币 1.00
13 港币 1.0627
14 美元 8.2764


要求:
1,统计20020531按‘机构’分组的sum值
2,数据库的金额1和金额2按‘货币代码’乘于‘汇率’
折算为人民币
3,数据库1 LEFT OUTER JOIN 数据库2
ON (数据库1.机构 = 数据库2.机构 )
AND (数据库1.日期 = 数据库2.日期)
AND (数据库1.货币代码 = 数据库2.货币代码)
4,注意sybase是只读的不能用 create view 语句
生成视图
5,最好用一个select语句,或者在tquery中的sql
一次性把它计算出来
{:> 好累啊!敲那么多字,都清楚了吗?
本人好困惑!高手者我还加分!
 
哎呀!敲昏了!
还有条件没有写完
sum值是先把记录相同(包括机构,日期,货币)的记录中的金额1和金额2(如果有的话)
相加,再把它们按货币代码相应的汇率折成人民币,再取sum值
罗里罗嗦! 我都写糊涂了!
 
啊!看来是难了一点,本人也想了很久!
 
我认为多个结构相同的表应首先用insert语句形成一个临时表再进行分组统计计算。
表1:
机构 日期 货币代码 金额1
表2:
机构 日期 货币代码 金额1

如果只用select语句,我想这可能不行
 
想了一下,大概如下:
其中“日期=20020531”这句要根据sybase的特点来改。
select 机构,sum(rmb) As rmb from
(select a.机构,a.日期,a.金额2*b.汇率 As rmb from 数据库1 a,数据库3 b where a.货币代码=b.货币代码 where 日期=20020531
union all
select a.机构,a.日期,a.金额2*b.汇率 as rmb from 数据库2 a,数据库3 b where a.货币代码=b.货币代码 where 日期=20020531) group by 机构
 
to yun.li
但sybase只能是只读的啊!
 
to: pnljh
我没有用过union语句,不过可以商榷一下:
1,union中,如果用all的话,会把所有的重复的记录显示在结果中,这样用后面用group by
的意义就不大了
2,而且union语句会把第一个的select语句和第二的select语句中的金额相加吗?(在机构,日期
相等的时候)
 
union相当于是把两个表的内容拼成一个表,更明白一点,
1、怕有重复,可以将第一行的select 机构,sum(rmb) As rmb from改为
  select distinct 机构,sum(rmb) As rmb from
2、
假设有两个表A和表B,使用A union B,就是把B表的所以记录添加到A表。当然,前提是
两个表的结构要一致。所以union并不会将金额相加。
 
to pnljh
我要求的是进行的数据库操作是这样的
先设:条件f——满足机构相等,日期相等的记录
t1——数据库1 t2——数据库2
j——机构 c——货币代码
h——汇率
(其中t1.j包涵t2.j)
要求统计
1,按j分组
2,sum(t1满足f的记录根据c×h+t2满足f的记录根据c×h)

你的select语句不能满足我的要求吧!不知道是否还有高见!
喔!先谢谢你!


 
就没觉得有什么难!

//数据库1 LEFT OUTER JOIN 数据库2
ON (数据库1.机构 = 数据库2.机构 )
AND (数据库1.日期 = 数据库2.日期)
AND (数据库1.货币代码 = 数据库2.货币代码)
表述不清晰,为什么需要这样连接,
明明两张表没有主从关系,或则说可以是多张表,之间没有关系,只是数据分布存储在多处.
不知道理解对吗?

pnljh回答基本方向正确.但不知道sybase支持到什么程度.
我也只能按oracle的语法给出sql.

核心语句:
select a.j,sum(a.fee*b.h) from (select * from t1 union all select * from t2) a,
t3 b where a.code=b.code and a.date='20020531' group by a.j

 
高手呢?
我追加200分,如何?不知道斑竹能帮忙吗?
 
select a.j,sum(a.fee*b.h) from (select * from t1 union all select * from t2) a,
t3 b where a.code=b.code and a.date='20020531' group by a.j
中的a.fee是什么?
 
不知是不是这样:
SELECT ta.机构,ta.日期,ta.货币代码,Sum(ta.金额*tb.汇率) 金额,
(SELECT 机构,日期,货币代码,金额1 as 金额
FROM Table1
union
SELECT 机构,日期,货币代码,金额2 as 金额
FROM Table2 ) as ta,
table3 tb
WHERE ta.货币代码= tb.货币代码
and 其它条件
 
a.fee,
就是金额啊!
一定要用union all
不能用union,防止数据丢失.

to mike_tan
我理解的对不对?
 
to:gophie
sybase好像不支持from后加union的语句,用sybase的sql advantage 调试出现
Incorrect syntax near the keyword 'from'. 的错误!
 
呵呵,又不让用UNION,又不能把两张表物理上合并!
没有办法啦!
 
我不信这个邪![:p]《==《
 
sybase 和 MS SQL Server 应该差不多吧?原来是一家人嘛!
MS SQL Server 2000 中可以用 Case 语句
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
986
SUNSTONE的Delphi笔记
S
S
回复
0
查看
804
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部