情况说明一下:
需求:取出30天的平均销量.
此SQL是取出平均值.
需要30天的话 就 * 30就可以了
select avg(d.xssl)
  from CC_JXC_GYS_DAY d
 inner join CC_JXC_GYS_DAY_HIS his
    on d.gys = his.gys
 where his.rq in (select distinct d.rq
                    from CC_JXC_GYS_DAY d
                   group by d.rq
                  having count(*) >= 1)
   and his.rq between his.rq and d.rq

解决方案 »

  1.   

    你给这个rq加个索引。将in改成exsist 试试 
      

  2.   

    20W条数据对于oracle来说瞬间的事情,能肯定的是你的写法有问题select avg(d.xssl)
      from CC_JXC_GYS_DAY d
     inner join CC_JXC_GYS_DAY_HIS his
        on d.gys = his.gys
     where his.rq in (select distinct d.rq
                        from CC_JXC_GYS_DAY d
                       group by d.rq
                      having count(*) >= 1)
       and his.rq between his.rq and d.rq此SQL是取出平均值.  所有20W数据的平均值?
    最疑惑的是and his.rq between his.rq and d.rq,自己和自己的日期比较?有意义么,肯定相等啊,
    完全没有时间区间啊,兄弟,SQL有问题,贴出完整表结构和需求
      

  3.   

    感觉很混乱的逻辑
    and his.rq between his.rq and d.rq
    不就是 his.rq<=d.rq么
      

  4.   

    需求:求库存的可销天数(按30天平均销量取值)(完了)
    当日销售表CC_JXC_GYS_DAY RQ DATE N 日期
    MC VARCHAR2(4) N 卖场
    GYS VARCHAR2(8) N 供应商号
    GYSM VARCHAR2(60) Y 供应商名
    SPTM VARCHAR2(13) N 商品编码
    SPM VARCHAR2(60) Y 商品名
    PP VARCHAR2(6) Y 品牌号
    PPM VARCHAR2(20) Y 品牌名
    CD VARCHAR2(6) Y 产地号
    CDM VARCHAR2(32) Y 产地名
    DZXL VARCHAR2(15) N 类别号
    DZXLM VARCHAR2(60) Y 类别名
    DW VARCHAR2(4) Y 单位
    JYFS CHAR(1) N 经营方式
    LSJ FLOAT N 实际零售价
    XSSL FLOAT Y 销售数量
    XSJE FLOAT Y 实际销售额
    HSJJ FLOAT N 含税进价
    HSJJJE FLOAT Y 含税成本
    XSSLZB FLOAT Y 销售额
    XSSLPM NUMBER Y 含税毛利
    XSJEZB FLOAT Y 进销差价
    XSJEPM FLOAT Y
    GYS_SLZB FLOAT Y
    GYS_SLPM FLOAT Y
    GYS_JEZB FLOAT Y
    GYS_JEPM FLOAT Y
    KCSL FLOAT Y 总折扣
    KCJE FLOAT Y 供应商折扣
    BAK1 VARCHAR2(13) Y 商品条码
    BAK2 VARCHAR2(10) Y 备用
    库存表CC_STR_COM_HZ RQ DATE N 日期
    SPTM VARCHAR2(13) N 商品编码
    SPM VARCHAR2(60) Y 商品名称
    MC VARCHAR2(15) N 卖场编码
    PP VARCHAR2(6) Y 品牌编码
    DZXL VARCHAR2(15) N 类别编码
    GZ VARCHAR2(15) N 柜组
    GYS VARCHAR2(15) N 供应商编码
    JYFS FLOAT N 经营方式
    ZHHSJJ FLOAT Y 最后含税进价
    ZHBHSJJ FLOAT Y 最后不含税进价
    KL FLOAT Y 扣率
    LSJ FLOAT Y 零售价
    KCSL FLOAT Y 库存数量
    KCBHSJE FLOAT Y 库存不含税金额
    KCHSJE FLOAT Y 库存含税金额
    KCLSJE FLOAT Y 库存零售金额历史日销售表CC_JXC_GYS_DAY_HIS RQ DATE N 日期
    MC VARCHAR2(4) N 卖场
    GYS VARCHAR2(8) N 供应商号
    GYSM VARCHAR2(60) Y 供应商名
    SPTM VARCHAR2(13) N 商品编码
    SPM VARCHAR2(60) Y 商品名
    PP VARCHAR2(6) Y 品牌号
    PPM VARCHAR2(20) Y 品牌名
    CD VARCHAR2(6) Y 产地号
    CDM VARCHAR2(32) Y 产地名
    DZXL VARCHAR2(15) N 类别号
    DZXLM VARCHAR2(60) Y 类别名
    DW VARCHAR2(4) Y 单位
    JYFS CHAR(1) N 经营方式
    LSJ FLOAT N 实际零售价
    XSSL FLOAT Y 销售数量
    XSJE FLOAT Y 实际销售额
    HSJJ FLOAT N 含税进价
    HSJJJE FLOAT Y 含税成本
    XSSLZB FLOAT Y 销售额  同类别销售数量占比
    XSSLPM NUMBER Y 含税毛利
    XSJEZB FLOAT Y 进销差价
    XSJEPM FLOAT Y 同类别销售金额排名
    GYS_SLZB FLOAT Y 本供应商销售数量占比
    GYS_SLPM FLOAT Y 本供应商销售数量排名
    GYS_JEZB FLOAT Y 本供应商销售金额占比
    GYS_JEPM FLOAT Y 本供应商销售金额排名
    KCSL FLOAT Y 总折扣
    KCJE FLOAT Y 供应商折扣
    BAK1 VARCHAR2(13) Y 商品条码
    BAK2 VARCHAR2(10) Y 备用另:
    说明下那个SQL:
    这是昨日我修改后的SQL:  (select (avg(d.xssl) * 30) as dsinventory
                              from CQ_JXC_GYS_DAY d
                             inner join CQ_JXC_GYS_DAY_HIS his
                                on d.gys = his.gys
                             where his.rq in (select distinct d.rq - 30
                                                from CQ_JXC_GYS_DAY d
                                               group by d.rq
                                              having count(*) >= 1)
                               and his.rq between his.rq and d.rq) p 
    通过取出当日销售表里的日期-30天.获得30天前的日期.
    然后通过与历史日销售里的日期进行判断.取出相同的日期数据,
    然后取出销售数量(30天),通过AVG取得每日平均值,最后*30就是30天的可销售天数了 
    判断历史日期中,在历史日期和当天日期之间的数据,作为判断条件.
    (PS:我说的20W是总数据,但是重复数据就有差不多20W--测试数据有问题.)
      

  5.   

    select distinct d.rq - 30
    from CQ_JXC_GYS_DAY d
     group by d.rq
    having count(*) >= 1通过取出当日销售表里的日期-30天.获得30天前的日期.
    为什么这么取?当日销售表里的日期-30天?
    取当天的日期-30不久OK了,如果没有的话也是销售表里取最大日期-30不久OK了?