【问题标题】:Oracle Sql, How do I group day values into a months summaryOracle Sql,如何将日期值分组为月份摘要
【发布时间】:2020-10-21 03:40:39
【问题描述】:

想知道是否有人可以提供帮助。

我正在尝试获取日期列中的值、日期值并将天分组为一个月,以获得当月收到的托盘总数的摘要。

在我的 select/group 语句中添加 to_char(conf_date, 'MM-YYYY') 时出现错误,'ORA-01722: invalid number'。

提前致谢!

我当前的 SQL

with pallets_received as (
select a.comp_code, 
       a.cust_code, 
       a.rcpt_num, 
       to_char(a.rcpt_conf_date,'mm-dd-yyyy')conf_date,
       sum(b.rcpt_loc_qty)/(c.item_qty_bkd_qty) pallets
from e_rcpt_h a
left join e_rcpt_d5D1 b
       on a.comp_code=b.comp_code 
       and a.rcpt_num=b.rcpt_num
left join m_item_d1 c
       on b.comp_code=c.comp_code 
       and b.cust_code=c.cust_code 
       and b.invt_lev1=c.item_code
where a.comp_code='T3'
       and c.item_qty_bkd_lev_num=1
       and a.cust_code='101029'
       and a.flow_pros_code='CORE'
       and trunc(a.rcpt_conf_date) >= to_date('02-01-2020','mm-dd-yyyy')
group by a.comp_code, 
         a.cust_code, 
         a.rcpt_num, 
         a.rcpt_conf_date, 
         c.item_qty_bkd_qty
order by conf_date
)
select comp_code, 
       cust_code, 
       conf_dateas month, 
       sum(ceil(pallets)) pallets
from pallets_received
group by comp_code, 
         cust_code, 
         conf_date
order by conf_date

表格

comp_code | cust_code | conf_date  | pallets
---------------------------------------------
T3          101029      03-06-2020   2
T3          101029      03-09-2020   8
C4          101029      04-05-2020   2
C4          101029      04-05-2020   8

我想要达到的输出

comp_code | cust_code | month   | pallets
---------------------------------------------
T3          101029      03-2020   10
C4          101029      04-2020   10

【问题讨论】:

  • conf_date 是表中的 DATE 类型吗?另外,请缩进您的代码,以便于阅读。谢谢
  • 您好 OldProgrammer,对于缩进很抱歉,我编码不多,也不确定要缩进什么,它可能只是随机缩进,哈哈。表 e_rcpt_h 中的原始日期显示为 2020-03-06 00:00。所以我使用With中的sql转换了那个日期。

标签: sql oracle


【解决方案1】:

CONF_DATE 只是 'to_char(a.rcpt_conf_date,'mm-dd-yyyy')' 的字符串结果的别名,因此 CONF_DATE 实际上只是一个字符串。然而,在您的 GROUP BY 中,您将其提供给 TO_CHAR。这迫使 oracle 首先使用 NLS_DATE_FORMAT 的控制值执行隐含的 TO_DATE。这几乎可以保证返回错误。

group by comp_code, 
         cust_code, 
         trunc(rcpt_conf_date,'MON')

(是的,你需要学习格式化你的代码......为了你自己以及其他必须阅读它的人的理智。)

【讨论】:

  • 嗨,埃德史蒂文斯,谢谢。我更新了我的代码,我希望它更容易阅读。我仍然有问题。按 comp_code、cust_code、trunc(rcpt_conf_date,'MON') 分组产生错误,ORA-00904:“RCPT_CONF_DATE”:标识符无效。如果我使用 trunc(conf_date,'MON') 我会得到一个“不是 GROUP BY 表达式”。谢谢。
  • 您好 EdStevens,我将编码更新为我之前使用的工作查询,以获取示例中显示的表查询结果。
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2014-04-04
相关资源
最近更新 更多