Oracle SQL - 查询开始和结束月/年组合

时间:2014-02-04 20:30:49

标签: sql oracle

我尝试编写一个需要四个用户输入的查询:

开始月份

年初

结束月

结束年度

直到我遇到编码查询方式的一个小问题时才显得非常直接,当以下输入用作示例时会发生:

开始月份:1月

年初:2012年

结束月份:八月

结束年份:2013

按照我对查询进行编码的方式,它只选择了2012年1月到8月以及2013年1月到8月。我希望它能够在2012年全年到2013年1月到8月之间完成。我和#39 ;我猜我需要一个联合声明来实现这一点,但我承认我不太擅长Oracle SQL,因为我没有多少机会经常练习它。因此,我可能会以错误的方式解决这个问题。

我尝试更新我的查询以包含一个union语句,并且Oracle在我的组中的三个字段上使用表达式(trsum.project_id,trsum.month和trsum.year)时使用了无效标识符时抛出错误。当我尝试将这些更改为我已分配给列的别名(ordered_id,ordered_month和ordered_year)时,我收到有关project_id字段不是单个组函数的错误。关于创建包含按表达式分组的联合查询,我显然遗漏了一些内容,但如果我能弄清楚到底是什么,我会感到很沮丧。

我已经包含了我更新查询的简化版本,该版本保留了我在此提及的所有必需品,以供参考。在union语句之前的前半部分是我写的原始查询,而后半部分是我尝试从上面的例子中获取我正在寻找的数据。如果有人对我做错了什么有任何建议或建议,或者有更好的方法来获取我所寻求的数据,我会对所有建议持开放态度。如果有任何需要进一步澄清的事情,请随时提出。

select * from(
    select  trsum.project_id as ordered_id
          , trsum.month as ordered_month
          , trsum.year as ordered_year
          , sum(trsum.costs) "Costs"
          , sum(trsum.hours) "Hours"
    from 
        substituteTableName trsum
    where
        trsum.month between :START_MONTH and :END_MONTH
        and trsum.year between :START_YEAR and :END_YEAR

    union

    select  trsum2.project_id as ordered_id
          , trsum2.month as ordered_month
          , trsum2.year as ordered_year
          , sum(trsum2.costs) "Costs"
          , sum(trsum2.hours) "Hours"
    from 
        substituteTableName trsum2
    where
        trsum2.month between :START_MONTH and 11
        and trsum2.year = :START_YEAR
)
group by trsum.project_id, trsum.month, trsum.year
order by
      ordered_id
    , ordered_year
    , ordered_month

2 个答案:

答案 0 :(得分:2)

您应该使用日期,而不仅仅是月份,因为这不正确。类似的东西:

WHERE 
  to_date((trsum.ppt_fiscal_month + 1 || '-' || trsum.ppt_fiscal_year), 'MM-YYYY') >=
      to_date((start_month || '-' || start_year), 'MM-YYYY'
AND 
to_date((trsum.month + 1 || '-' || trsum.year),'MM-YYYY') <= 
        to_date((end_month || '-' || end_year), 'MM-YYYY'

与其他条件类似。

答案 1 :(得分:0)

我认为解决这些问题的一种简单方法是将值转换为YYYYMM格式。您的where条款变为:

where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH and
                                           :END_YEAR * 100 + :END_MONTH


where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH
                                           :START_YEAR * 100 + 11;

当然,第二个不必改变。它应该按照书面形式正确工作。