【问题标题】:SQL query with SELECT,COUNT and subquery joins not returning rows带有 SELECT、COUNT 和子查询连接的 SQL 查询不返回行
【发布时间】:2013-01-30 12:51:16
【问题描述】:

我有以下选择查询,它返回以下数据:

查询:

SELECT DISTINCT ALLVW.GP_PAYGROUP,
                ALLVW.PRD_END_DT,
                TMP.PRD_END_DT
FROM PS_AZ_DFN_ALPRD_VW ALLVW,
     PS_AZ_DFMPRP_TMP4 TMP
WHERE ALLVW.GP_PAYGROUP = TMP.GP_PAYGROUP
  AND ALLVW.PRD_END_DT < TMP.PRD_END_DT

结果:

PAYGROUP    PRD_END_DT      PRD_END_DT_1

AMZ_PG_T1   31-JAN-12   31-DEC-12
AMZ_PG_T1   29-FEB-12   31-DEC-12
AMZ_PG_T1   31-MAR-12   31-DEC-12
AMZ_PG_T1   30-NOV-12   31-DEC-12
AMZ_PG_T2   31-JAN-12   31-OCT-12
AMZ_PG_T2   30-SEP-12   31-OCT-12
AMZ_PG_T2   31-MAR-12   31-OCT-12
AMZ_PG_T2   30-APR-12   31-OCT-12

所以现在,我希望每个PAYGROUPPRD_END_DTPRD_END_DT_1 之前的“x”个周期,例如x = 1,我的查询应该返回:

 PAYGROUP    PRD_END_DT      PRD_END_DT_1
 AMZ_PG_T1   30-NOV-12       31-DEC-12
 AMZ_PG_T2   30-SEP-12       31-OCT-12

我厌倦了以下操作,但无济于事:

SELECT DISTINCT ALLVW.GP_PAYGROUP,
                ALLVW.PRD_END_DT,
                TMP.PRD_END_DT
FROM PS_AZ_DFN_ALPRD_VW ALLVW,
     PS_AZ_DFMPRP_TMP4 TMP
WHERE ALLVW.GP_PAYGROUP = TMP.GP_PAYGROUP
  AND ALLVW.PRD_END_DT < TMP.PRD_END_DT
  AND 1 =
    (SELECT COUNT(XVW.PRD_END_DT)
     FROM PS_AZ_DFN_ALPRD_VW XVW
     WHERE XVW.GP_PAYGROUP = TMP.GP_PAYGROUP
       AND XVW.PRD_END_DT < TMP.PRD_END_DT)

您能否建议可能的方法。感谢您的投入。

【问题讨论】:

    标签: sql oracle select count subquery


    【解决方案1】:
    SELECT * FROM (
      your original SELECT DISTINCT... query
    ) t where datediff(month, PRD_END_DT, PRD_END_DT_1) = x
    

    【讨论】:

    • 我不是专门在这里找几个月的。我只是在寻找前期。前期日期也可以在前一周而不是月份。现在还编辑了我的问题。
    【解决方案2】:
    SELECT DISTINCT ALLVW.GP_PAYGROUP, ALLVW.PRD_END_DT, TMP.PRD_END_DT
    FROM PS_AZ_DFN_ALPRD_VW ALLVW
    JOIN PS_AZ_DFMPRP_TMP4 TMP ON ALLVW.GP_PAYGROUP = TMP.GP_PAYGROUP
    WHERE ALLVW.PRD_END_DT < TMP.PRD_END_DT
      AND add_months(trunc(ALLVW.PRD_END_DT, 'month'), 1) >= trunc(TMP.PRD_END_DT, 'month')
    

    【讨论】:

    • 我不是专门在这里找几个月的。我只是在寻找前期。前期日期也可以在前一周而不是月份。现在还编辑了我的问题。
    • @MikeG:修改答案以反映这一点。
    • 非常感谢。有效。但是,如果我不只想要前一个月本身,如果我想要前一周怎么办。我需要将“月”更改为“周”吗?是否有一个通用的解决方案,这样查询只会得到之前“x”个周期的周期。
    • 基本上 - 我正在寻找 max(prd_end_dt) where count(prd_end_dt) between the date = x
    • @MikeG:困难在于计算前一周(或任何其他时期)的开始时间。在许多情况下,它是一种语义计算,不受标准数学运算符的约束,并且需要使用日/月/周识别。如果您可以说“x 天前”,那会更简单,您可以为此制定一个通用公式。
    【解决方案3】:

    尝试使用dense_rank函数:

    例如

    Select a, b, c
    From ( select a, b, c, dense_rank() over (partition by a order by b desc) r
           from table)
    Where r < :x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多