这个表的SQL查询语句怎么写?(50分)

  • 主题发起人 主题发起人 www.www
  • 开始时间 开始时间
W

www.www

Unregistered / Unconfirmed
GUEST, unregistred user!
有以下2个表:<br>1.销售表(日期,销售金额,销售成本)<br>2.销售退货表(日期.销售退货金额,销售退货成本)<br>其中:<br>实际利润=(销售金额-销售成本)-(销售退货金额-销售退货成本)<br><br>怎么得到下面的查询结果:<br>日期,合计销售金额,合计退货金额,合计实际利润
 
select 日期,<br>&nbsp; &nbsp; &nbsp; &nbsp;sum(销售金额) 合计销售金额,<br>&nbsp; &nbsp; &nbsp; &nbsp;sum(销售退货金额) 合计退货金额,<br>&nbsp; &nbsp; &nbsp; &nbsp;(销售金额 - 销售成本) - (销售退货金额 - 销售退货成本) 合计实际利润<br>&nbsp; from (select 日期, 销售金额, 销售成本, 0 销售退货金额, 0 销售退货成本<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; from 销售表<br>&nbsp; &nbsp; &nbsp; &nbsp; union all<br>&nbsp; &nbsp; &nbsp; &nbsp; select 日期, 0 销售金额, 0 销售成本, 销售退货金额, 销售退货成本<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; from 销售退货表)<br>&nbsp;group by 日期
 
TO:power255<br>你写的太复杂了,有没有简单点的,我把你的改了一下,加了 as,都不行.<br>我想可以在ACCESS和SQL中使用.<br><br>另外表1,2我是为了大家方便看才这样写字段名的,实际的字段名字应该是:<br>1.销售表(日期,合计金额,合计成本)<br>2.销售退货表(日期.合计金额,合计成本)
 
power255的写法应该是可以的呀,感觉蛮有创意的。<br>乱写一个哟,没测试过(前提是:你这两个表都是合计表,不是明细表,还有,日期是2008-1-1形式的,不包括时间,不能是2008-1-1 12:00):<br>SELECT A.日期,SUM(A.合计金额) AS 合计销售金额,SUM(B.合计金额) AS 合计退货金额,SUM(A.合计金额-A.合计成本-B.合计金额+B.合计成本) AS 合计实际利润 FROM 销售表 A LEFT JOIN 销售退货表 ON A.日期=B.日期 GROUP BY A.日期
 
这种定法是最简单的。你再看一下这种写法。D表是取销售表和销售退货表的日期<br><br>select D.日期,<br>&nbsp; &nbsp; &nbsp; &nbsp;(select sum(合计金额) from 销售表 S where S.日期 = D.日期) as 合计销售金额,<br>&nbsp; &nbsp; &nbsp; &nbsp;(select sum(合计金额) from 销售退货表 Q where Q.日期 = D.日期) as 合计退货金额,<br>&nbsp; &nbsp; &nbsp; &nbsp;(select sum(合计金额 - 销售成本) from 销售表 S where S.日期 = D.日期) -<br>&nbsp; &nbsp; &nbsp; &nbsp;(select sum(合计金额 - 销售退货成本)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; from 销售退货表 Q<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where Q.日期 = D.日期) as 合计实际利润<br>&nbsp; from (select distinct 日期<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; from (select 日期<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; from 销售表<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; union all<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select 日期 from 销售退货表)) D
 
感谢:power255<br>上面这种方法,我试了可以,很好.!<br>1.但如果:某一天销售表有记录,而销售退货表没有记录,那么销售退货金额那里就显示为空,利润也显示为空.(正确应该是销售退货金额显示为:0,利润应该是:销售金额-0),请问怎么解决?<br><br>2.另外,如果查询的是某个日期范围:D1 ~ D2,那么where该怎么改?<br><br>3.我查询后用dbgrid显示.日期那一栏不知道为什么变得很宽,长度足足一个屏幕那么宽,要拉滚动条才能看到后面的金额,利润.
 
1、iif(销售退货金额 is null, 0, 销售退货金额)<br>2、CreateDate&gt;=#2007-11-12# and CreateDate&lt;=#2007-12-12# &nbsp;<br>3、日期这一栏数据库你是不是保存为字符串类型?
 
power255:<br>您真热情,技术又好,我初学,谢谢指点:<br><br>1、iif(销售退货金额 is null, 0, 销售退货金额),请问这句放在上面的SQL代码里怎么写?<br><br>2、CreateDate&gt;=#2007-11-12# and CreateDate&lt;=#2007-12-12# ,这个放在哪里?(如果日期是输入后赋值给了 D1(2008-01-01)和D2(2008-01-30),该怎么写)<br>&nbsp;<br>3、日期这一栏数据库你是不是保存为字符串类型? ,是的,字符串类型,你真厉害,该怎么处理(不改数据库类型)<br><br>可以把完整的代码写出来吗?也就是把以上的加入到你上面的那段你说最简单的代码里.
 
1、销售退货表没有记录,那么销售退货金额那里就显示为空。是因为数字加一个空值null就会等于空值。你自已试着改吧。<br>2、D1(查询的字段名)为日期时<br>D1&gt;=#2008-01-01# and CreateDate&lt;=#2008-01-30# <br>D1(查询的字段名)为字符时<br>D1&gt;='2008-01-01' and CreateDate&lt;='2008-01-30'<br>3、你把长度改小。
 
多人接受答案了。
 
我用了iif(销售退货金额 is null, 0, 销售退货金额)<br>在ACCESS可以<br>在SQL2000提示出错?不知道为什么,怎么改
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部