首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 老问题了,上次没解决,求ORACLE查询语句的写法. [已结贴,结贴人:iuu54321]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuu54321
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-22 22:11:30 楼主
    老问题了,上次没能解决掉,特又来烦扰各位老师:
    SQL code
    ----------------------- 表1 ----------------------- 同一ID有多种甚至上百种物种.ID不是物种编号,而是顾客唯一标识.VISIT_NO是提货次数. T_DATE VISIT_NO ID ITEM_NAME SPEC AMOUNT UNITS 2008-6-1 14:43 1 00001 灯泡 100W 22008-7-4 14:43 1 00002 灯泡 100W 32008-7-4 14:43 1 00002 节能灯 50W 52008-7-4 14:43 1 00002 消毒灯 100W 32008-7-5 14:43 2 00003 灯泡 100W 4//注意① 2008-7-5 14:43 2 00003 节能灯 100W 7//注意② 2008-7-5 14:43 2 00003 消毒灯 100W 8//注意③ 2008-7-6 14:43 1 00004 灯泡 100W 52008-7-7 14:43 2 00005 灯泡 100W 62008-7-8 14:43 1 00006 灯泡 100W 3----------------------- 表2 ----------------------- 表1中有//注意①,表2没有,当出现这类情况时,则转向表3取值.以a3.t_date和a3.id关联. 注意:每天日期时间是不同的.但又必须有时间段约束.不然把除本月之外的相同ID也会一 并提取统计进来. WW_DATE VISIT_NO TEXT NAME ID 2008-6-1 14:43 1 灯泡 李1 00001 2008-1-4 8:43 1 灯泡 李2 00002 2008-1-4 8:43 1 节能灯 李2 00002 2008-1-4 8:43 1 消毒灯 李2 00002 2008-1-5 8:43 2 节能灯 李3 00003 //注意② 2008-1-5 8:43 2 消毒灯 李3 00003 //注意③ 2008-1-6 8:43 1 灯泡 李4 00004 2008-1-7 8:43 2 灯泡 李2 00005 2008-1-8 8:43 1 灯泡 李6 00006 ----------------------- 表3 ----------------------- 注意:每天日期时间是不同的.但又必须做为限制条件.不然把除本月之外的相同ID也会一并提取统计进来,因此不能没有时间约束. ID VISIT_NO EE_DATE NAME 00001 1 2008-6-1 14:43 李1 00002 1 2008-1-4 10:21 李2 00003 2 2008-1-5 10:21 李3 00004 1 2008-1-6 10:21 李4 00005 2 2008-1-7 10:21 李2 00006 1 2008-1-8 10:21 李6 00007 1 2008-1-9 10:21 李2 00008 1 2008-1-10 10:21 李2 00009 1 2008-1-11 10:21 李9 00010 1 2008-1-12 10:21 李2 00011 1 2008-1-13 10:21 李4 00012 1 2008-1-14 10:21 李4 00013 1 2008-1-15 10:21 李2 00014 1 2008-1-16 10:21 李1 00015 1 2008-1-17 10:21 李3 ----------------------- 最终结果生成表4 ----------------------- 表4日期格式:YYYY-MM. T_DATE NAME ITEM_NAME SPEC AMOUNT UNITS 2008-07 李1 灯泡 100w 332008-07 李2 灯泡 100w 532008-07 李3 灯泡 100w 402008-07 李4 灯泡 100w 172008-07 李5 灯泡 100w 82008-07 李6 灯泡 100w 32008-07 李8 灯泡 100w 3 只 当向表2取NAME值无效,或不存在时,转取表3。 手边有个表1关联表2的,或请朋友们给改写成关联表3的 【句一】 select to_char(a1.t_date,'yyyy-mm') t_date, a2.name, a1.item_name, a1.spec, to_char(sum(to_number(substr(amount,1,length(amount-1)))))amount,units from table1 a1,table2 a2 where to_char(a1.t_date, 'yyyy-mm-dd') = to_char(a2.ww_date, 'yyyy-mm-dd') and a1.ITEM_NAME = a2.TEXT and a1.visit_no =a2.visit_no and a1.ID=a2.ID and a1.t_date between to_date('2008-7-1','yyyy-mm-dd') and to_date('2008-7-31','yyyy-mm-dd')+0.99999 and a1.item_name = '灯泡' ; group by to_char(a1.t_date,'yyyy-mm'), a2.name, a1.item_name, a1.spec, units 【句二】 select to_char(t1.t_date, 'yyyy-mm') t_date, t2.name, t1.item_name, t1.spec, sum(to_number(substr(amount, 1, length(amount - 2)))) amount, t1.units from table1 t1, table2 t2 where to_char(t1.t_date, 'yyyy-mm-dd') = to_char(t2.ww_date, 'yyyy-mm-dd') and a1.ITEM_NAME = a2.TEXT and a1.visit_no =a2.visit_no and a1.ID=a2.ID and to_char(t1.t_date, 'yyyy-mm-dd') >= '2008-07-1' and to_char(t1.t_date, 'yyyy-mm-dd') <= '2008-07-31' and a1.item_name = '灯泡' ; group by to_char(t1.t_date, 'yyyy-mm'), t2.name, t1.item_name, t1.spec, t1.units;

    或请朋友们给改写成关联表3的.拜谢了!
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mantisXF
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-22 22:52:251楼 得分:10
    可能是本人天生愚笨,看了3遍还没明白需求。

    如果可以的话,是否能按以下方式贴出需求?

    1: 要用到的source tables.

    2: 要生成的target table.

    然后解释target table的数据是怎么生成的并且要注意的地方.

    最好别贴以前的写的SQL,因为这会难以理解并且更混淆.


    Just FYI ...

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuu54321
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 02:05:362楼 得分:0
    以上两个例句是当向表2取值成功时的写法,
    我现在需要的是当向表2取值为NULL时则转向表3取值,并计算所取值在表1.AMOUNT的和.


    上一次没完全解决好的问题贴:
    http://topic.csdn.net/u/20080806/16/9c53c06f-ce2b-4598-a7ec-5f684a77bd19.html

    以"灯泡"为条件向【表1】检索满足日期时间>= '2008-07-1' <= '2008-07-31'范围内所有的ID,并以此结果关联向【表2】中满足日期时间>= '2008-07-1' <= '2008-07-31'范围内,TEXT=灯泡的NAME字段取值,当【表2.NAME】字段有值时,则生成【表4】所示,当【表2.NAME】字段(或缺少行)为NULL时,则以向【表3.NAME】取值以ID为关联,日期时间仍要限定>= '2008-07-1' <= '2008-07-31'

    注:1.【表1】【表2】【表3】中的日期时间不相同。
        2.表1.ID = 表2.ID = 表3.ID
          表1.visit_no = 表2.visit_no = 表3.visit_no
        3.【表1】和【表2】的id是有重复的,但条件加上
              a1.ITEM_NAME = a2.TEXT
          and a1.visit_no =a2.visit_no
          就不会有重复

          表3和表1只是id相关联,全的,有可能出.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuu54321
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 11:51:203楼 得分:0
    别沉了啊!朋友们想想办法?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mantisXF
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-23 14:29:104楼 得分:10
    如果是web页面run SQL语句然后返回出查询结果集的话,比如在JAVA里面写两个不同的方法,当关联表1和表2时返回为NULL记录后进行判断,再调用另外一个方法:关联表1 和表3的. 但是这样要进行数据库连接两次,比较消耗资源。

    写一个存储过程的方法实现比较好(为3个传入变量:开始日期、结束日期和item_name),因为上述需求貌似为逻辑化的思想,不如是否对你有帮助。

    Just FYI ..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hly930
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:20:465楼 得分:25

    下边是表1和表3的关联:你union上表1和表2的关联就可以了(仅做参考)

    select to_char(c1.t_date,'yyyy-mm') t_date,
          d1.name,
          c1.item_name,
          c1.spec,
          to_char(sum(to_number(substr(c1.amount,1,length(amount-1)))))amount,units
    from
    (select * from table1 a1 where not exists
      (select * from table2 a2 where
          to_char(a1.t_date, 'yyyy-mm-dd') = to_char(a2.ww_date, 'yyyy-mm-dd')
          and a1.ITEM_NAME = a2.TEXT
          and a1.visit_no =a2.visit_no
          and a1.ID=a2.ID
          and a1.t_date between to_date('2008-7-1','yyyy-mm-dd')
          and to_date('2008-7-31','yyyy-mm-dd')+0.99999
          and a1.item_name = '灯泡' ;
    ) ) c1,table3 d1
    where c1.id=d1.id
          and to_char(c1.t_date, 'yyyy-mm-dd') = to_char(d1.ww_date, 'yyyy-mm-dd')
          and c1.t_date between to_date('2008-7-1','yyyy-mm-dd')
              and to_date('2008-7-31','yyyy-mm-dd')+0.99999
          and c1.item_name = '灯泡' ;


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • parellax
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 16:17:596楼 得分:5
    up
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved