CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

对我来说极难的一个SQL问题!

楼主czyoooo(按时)2003-02-04 14:49:55 在 MS-SQL Server / 疑难问题 提问

数据库中有三张表:销售表、退货表、利润调整表:  
  要求给出结算报表。  
  结算报表就是要求出已经结算的记录。但是要求很繁。  
  比如:  
  销售表中有记录:  
  ID             GE1       GE2  
  1001       300       500  
  1002       500       700  
  1003       1000       800  
  退票表中有记录  
  ID             GE1       GE2     N  
  1001       -300     -400     1//其中“1”表示在1001未结算的时候发生退货。  
  1002       -400     -400     0//其中“0”表示在1002已经结算的时候发生退货。  
   
  利润调整表中有记录:(其中1、0   和退票的时候一样处理)  
  ID           GE1       GE2     N  
  1001       -30     -50     1  
  1002       -30     -60     0  
  要求结算报表时,如果退货记录字段为1那么和销售记录累加合并为一条记录。  
  1001   0     100  
  如果退货记录字段为0那么分开显示:  
  ID               GE1       GE2  
  1002         500         700  
  1002       -400       -400    
  利润调整也一样,最后显示的就是  
  ID                 GE1     GE2  
  1001           -30       50  
  1002         500       700  
  1002       -400     -400  
  1002       -30       -60    
  1003       1000       800  
  这个sql怎么写呢?大家是否可以得出效率高的算法  
  问题点数:0、回复次数:7Top

1 楼happydreamer(www.sz.js.cn,www.gyxk.com)回复于 2003-02-04 17:38:27 得分 0

select   a.ID,a.GE1,a.GE2  
  from  
  (   select   b.ID,b.GE1+c.GE1   as   GE1,b.GE2+c.GE2   as   GE2   from   sale   b   inner   join   tui   c   on   b.ID=c.ID   where   c.N=1  
  union    
      select   b.ID,b.GE1   ,b.GE2   from   sale   b   left   join   tui   c   on   b.ID=c.ID   where     c.ID   is   null   or   c.N=0  
  union    
    select   c.ID,c.GE1,c.GE2   from   sale   b   right   join   tui   c   on   b.ID=c.ID   where   c.N=0   or   b.ID   is   NULL  
   
  )a  
   
  ----------------------  
  ID               GE1               GE2  
  1001 0 100  
  1002 -400 -400  
  1002 500 700  
  1003 1000 800  
  Top

2 楼czyoooo(按时)回复于 2003-02-04 20:01:46 得分 0

你这样只做到了两张表累加,事实情况比这个要复杂,  
  要求销售表分别和退货表、调整表比较,分析后面两张表的N字段。  
  如果为1,那么和销售记录中记录号相同的累加,为0单独出现在结算报表中。Top

3 楼czyoooo(按时)回复于 2003-02-04 20:06:05 得分 0

你写的只出现了两张表,调整表没有呀!Top

4 楼happydreamer(www.sz.js.cn,www.gyxk.com)回复于 2003-02-04 22:46:04 得分 0

try:  
   
  select   a.ID,a.GE1,a.GE2  
  from  
  (   select   b.ID,b.GE1+c.GE1+d.GE1   as   GE1,b.GE2+c.GE2+d.GE2   as   GE2   from   sale   b   inner   join   tui   c   on   b.ID=c.ID    
  inner   join   profit   d   on   b.ID=d.ID   where   c.N=1   and   d.N=1  
  union    
      select   b.ID,b.GE1   ,b.GE2   from   sale   b   left   join   tui   c   on   b.ID=c.ID   where     c.ID   is   null   or   c.N=0  
  union    
      select   b.ID,b.GE1   ,b.GE2   from   sale   b     left   join   profit   d   on   b.ID=d.ID   where     d.ID   is   null   or   d.N=0  
  union    
    select   c.ID,c.GE1,c.GE2   from   sale   b   right   join   tui   c   on   b.ID=c.ID   where   c.N=0   or   b.ID   is   NULL  
  union    
    select   d.ID,d.GE1,d.GE2   from   profit   d   right   join   sale   b   on   d.ID=b.ID   where   d.N=0   or   b.ID   is   NULL  
   
  )a  
   
  -------------  
  1001 -30 50  
  1002 -400 -400  
  1002 -30 -60  
  1002 500 700  
  1003 1000 800  
   
   
  Top

5 楼rainxia(xiayu)回复于 2003-02-08 09:05:06 得分 0

兄弟用存储过程使用临时表Top

6 楼spring_ok(广州泰能软件)回复于 2003-02-08 09:20:43 得分 0

select   A.ID,   (A.GE1+B.GE1+C.GE1)   as   GE1,   (A.GE2+B.GE2+C.GE2)   as   GE2  
  From   A   left   join   B   on   A.ID=B.ID   And   B.N=1  
  Left   join   C   on   A.ID   =   C.ID   And   C.N=1  
  union  
  (select   ID,   GE1,   GE2   from   B   where   B.N=0)  
  union  
  (select   ID,   GE1,   GE2   from   B   where   B.N=0)  
   
   
  Top

7 楼19191919(小楼别筑)回复于 2003-02-08 14:05:17 得分 0

从题目看,没看出有左连接关系,除非指明依据销售商品的情况,察看其退票或调整情况,不过即便指明,依我看退票id肯定会存在于销售中,所以我想可以不用做连接,直接将表union一下,就应该可以了吧  
   
  select   id   ,sum(ge1)   as   ge1,sum(ge2)   as   ge2   from  
  (select   id,ge1,ge2   from   a  
  union   all  
  id,ge1,ge2   from   b   where   n=1  
  union   all  
  id,ge1,ge2   from   c   where   n=1)   as   a  
  group   by   id    
  union   all    
  (select   ID,   GE1,   GE2   from   B   where   n=0)  
  union   all  
  (select   ID,   GE1,   GE2   from   c   where   n=0)  
  Top

相关问题

  • 这个SQL怎么写,对我来说很难!
  • 对我来说这是个高难度的sql查询语句
  • 新手上路!请多关照!一个对我来说有点难的SQL语句问题!!!!!!!!!!!
  • 请各位大哥帮忙写一个简单(对我来说难)的SQL语句!~
  • 请教一个联查,求和的SQL语句,对我来说难,别别人来说可能很简单
  • 极难的sql查询,有二年以上数据开发人员请进!!!!!!!!!!!
  • 极难的sql查询,有二年以上数据开发人员请进!!!!!!!!!!!!!
  • 一个极难的sql查询,难死办公室所有人~~~~~~~~在线等高手解答
  • 对我来说具难的问题,从SQL SERVER库表中统计出数据把数据插入oracle的库表里~~~
  • 写这样的SQL语句对我来说有难度,一句话也说不清楚,各位哥哥姐姐们进来看看吧

关键词

  • 结算
  • 字段
  • 报表
  • 销售
  • null
  • ge
  • tui
  • 表
  • 记录
  • 退货

得分解答快速导航

  • 帖主:czyoooo

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo