在Oracle

时间:2019-04-23 10:28:32

标签: oracle

select RP.COUNTRYID,RP.PRDCODE,
  RP.REPID,
  RP.CHANNELID,
  RP.CUSTOMERID,
  RP.DIVISION,
  RP.WWCOGS_GAUSS,
  RP.WWCOGS_SAP,
  RP.WWCOGS_BusLine,
  RP.CURRID ,
  ADD_MONTHS(to_date('01-01-'||rp.year,'DD-MM-YYYY'),level-1) KFDATE
  from 
(SELECT CP.COUNTRYID,
  CP.PRDCODE,
  CP.REPID,
  CP.CHANNELID,
  CP.CUSTOMERID,
  IP.DIVISION,
  CP.WWCOGS_GAUSS,
  CP.WWCOGS_SAP,
  CP.WWCOGS_BusLine,
  CP.year,
  CP.CURRID from
(select distinct IBC.COUNTRYID ,
       decode(ls.dmdunit,null,mwa.ProductName,ls.dmdunit) PRDCODE,
    ReportingUnit REPID,
    '99' CHANNELID,
    IBC.COUNTRYID CUSTOMERID ,
    (
    CASE
      WHEN MWA.COGSSourceCF LIKE '%Gauss%'
      THEN MWA.COGSPriceCF * MWA.ExchRate
      ELSE NULL
    END) WWCOGS_GAUSS,
    (
    CASE
      WHEN MWA.COGSSourceCF LIKE '%SAP%'
      THEN MWA.COGSPriceCF * MWA.ExchRate
      ELSE NULL
    END) WWCOGS_SAP,
    (
    CASE
      WHEN MWA.COGSSourceCF NOT LIKE '%Gauss%'
      AND MWA.COGSSourceCF NOT LIKE '%SAP%'
      THEN MWA.COGSPriceCF * MWA.ExchRate
      ELSE NULL
    END) WWCOGS_BusLine,
    mwa.year,
  IRC.CURRID
 from BAM.M_WWCOGS_AREA MWA,
  MICSTAG.M_IBP_REPUNIT_CURRENCY IRC,
  micstag.M_IBP_BDREPORTINGCOUNTRY IBC
  ,MICSTAG.M_LOCALPRODUCT_STAG LS
WHERE MWA.ReportingUnit=IRC.REPID
--and mwa.productname='FR21030390085'
--and MWA.GaussCountry='BE BELGIUM'
AND IBC.COUNTRYPLANNINGGROUP =MWA.GaussCountry 
and IBC.businessdivision=31
and MWA.COGSPriceCF <>0
  and ls.REPORTINGUNITID(+)=mwa.ReportingUnit
  and ls.IBPLOCALPRDID(+)= mwa.ProductName ) CP, micstag.M_IBP_PRODUCT IP
  where CP.PRDCODE=IP.PRDID) RP
    CONNECT BY level <= 12  ;

以上查询得到不必要的重复,如果我使用独特的查询将永远运行。 要求根据rp结果集中的年份复制记录 考虑年份值为2019,则12条记录应从2019年1月1日到2019年12月1日。 一年中可能有多个值

1 个答案:

答案 0 :(得分:0)

CONNECT BY LEVEL <= 12技巧可以很好地与double配合使用,因为该表返回一行。当它们的基本结果集返回多行时,事情变得更加混乱,因为CONNECT BY会生成一个乘积。这就是为什么要重复的原因。

您需要做的是为连接指定一些其他条件。理想情况下,您将在投影中具有一个主键-我将假设它是REPID,因此,如果它有所不同,则需要对其进行调整。无论如何,您将需要以下内容:

) RP
    CONNECT BY level <= 12 
            and rp.repid = prior rp.repid
            and prior sys_guid() is not null

prior sys_guid()位可防止ORA-01436: CONNECT BY loop in user data.