【问题标题】:Teradata sql Select Failed [2616] Numeric Overflow occurred during computationTeradata sql 选择失败 [2616] 计算期间发生数值溢出
【发布时间】:2016-01-24 01:58:07
【问题描述】:

我明白了:

错误 2616(计算期间发生数值溢出)

当我运行下面的代码时。我开发了 2 个单独的查询,每个查询都运行。当我将它们放在一个查询中并使用UNION 时,我收到错误消息。联合的一侧返回 274 条记录,另一侧返回 277 条记录。当我收到此消息时,我正在使用Teradata SQL Assistant。我们正在使用版本14.10.0.07

with drvd_qry (operating_unit, grp_brn_id, ecr_dept_id, stn_id,  glt_seq) as
 (select
 soh.operating_unit,
 s.grp_brn_id,
 s.ecr_dept_id,
 s.stn_id,
 s.glt_seq

from stns s
 inner join rfs.stn_ops_hierarchies soh on soh.stn_stn_id = s.stn_id
 where substr(s.grp_brn_id, 1, 2) = 'G1'
 group by soh.operating_unit, s.grp_brn_id, s.ecr_dept_id, s.stn_id, s.glt_seq),

qry_drvd (ecr_ticket_no, open_item_id) as

(select
 j.ecr_ticket_no,
 j.open_item_id

from
 rfs.journal_entries j

where
 j.business_unit ='A0141'
 and j.accounting_date = cast ('23-SEP-2015' as date format 'dd-MMM-YYYY')
 and j.account_gl ='109850')

select
 dq.operating_unit as BU,
 dq.grp_brn_id as GPBR,
 dq.stn_id as STN_ID,
 j.department as DEPTID,
 ft.mrchnt_nbr as MERCH_NUM,
 j.ecr_ticket_no as TICKET_NUM,
 ft.prim_acct_frst_six_dgt_nbr as FIRST6,
 ft.prim_acct_last_four_dgt_nbr as LAST4,
 p.auth_nbr as AUTH_NUM,
 ft.stlmt_uniq_ref_nbr as REF_NUM,
 j.monetary_amount as GL_AMT,
 0.00 as BANK_AMT

from
 rfs.journal_entries j,
 rfs.pymts p,
 paymt.fin_tran ft,
 drvd_qry dq

where
 j.business_unit = 'A0141'
 and j.accounting_date = cast ('23-SEP-2015' as date format 'dd-MMM-YYYY')
 and j.account_gl in (109850)
 and cast(j.open_item_id as decimal(19,0)) = p.ecr_pymt_id
 and p.ram_rea_rnt_agr_nbr = j.rnt_agr_nbr
 and p.fin_tran_ref_id = ft.fin_tran_ref_id
 and dq.ecr_dept_id = j.department

UNION

select

b.BU,
 b.GPBR,
 b.STN_ID,
 b.DEPTID,
 b.MERCH_NUM,
 qd.ecr_ticket_no as TICKET_NUM,
 b.FIRST6,
 b.LAST4,
 b.AUTH_NUM,
 b.REF_NUM,
 b.GL_AMT,
 b.BANK_AMT

from

(select
 a.BU,
 a.GPBR,
 a.STN_ID,
 a.DEPTID,
 a.MERCH_NUM,
 a.REF_NUM,
 a.FIRST6,
 a.LAST4,
 p.auth_nbr as AUTH_NUM,
 p.ecr_pymt_id,
 a.GL_AMT,
 a.BANK_AMT

from

(select
 dq.operating_unit as BU,
 dq.grp_brn_id as GPBR,
 dq.stn_id as STN_ID,
 dq.ecr_dept_id as DEPTID,
 cast(f.merch_num as varchar(20)) as MERCH_NUM,
 f.ret_ref_num as REF_NUM,
 ft.prim_acct_frst_six_dgt_nbr as FIRST6,
 ft.prim_acct_last_four_dgt_nbr as LAST4,
 0.00 as GL_AMT,

case when f.tran_typ_cde = 1 then f.tran_amt
 when f.tran_typ_cde = 4 then f.tran_amt * -1
 end as BANK_AMT,

ft.fin_tran_ref_id

from paymt.fndng_recncl_dtl_rprt f,
 rfs.cc_mrchnt_nbr m,
 drvd_qry dq,
 paymt.fin_tran ft

where f.row_stat_cde = 'A'
 and cast (f.tran_proc_date as date format 'MM/DD/YYYY') ='09/23/2015'
 and m.mrchnt_nbr = f.merch_num
 and m.credit_card_typ = 'VI'
 and dq.stn_id = m.sta_stn_id
 and ft.stlmt_uniq_ref_nbr = f.ret_ref_num

group by
 dq.operating_unit,
 dq.grp_brn_id,
 dq.stn_id,
 dq.glt_seq,
 dq.ecr_dept_id,
 f.merch_num,
 f.ret_ref_num,
 ft.prim_acct_frst_six_dgt_nbr,
 ft.prim_acct_last_four_dgt_nbr,
 GL_AMT,
 BANK_AMT,
 ft.fin_tran_ref_id) a

left outer join rfs.pymts p on p.fin_tran_ref_id = a.fin_tran_ref_id) b

left outer join qry_drvd qd on cast(qd.open_item_id as decimal(19,0)) = b.ecr_pymt_id

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    我假设您的两个查询单独运行都可以。 UNION 运算符:

    将两个或多个查询的结果组合成一个结果集 包括属于联合中所有查询的所有行。 UNION 操作不同于使用组合列的连接 来自两个表。

    以下是合并两个结果集的基本规则 使用 UNION 进行查询:

    • 所有查询中列的数量和顺序必须相同。

    • 数据类型必须兼容。

    我看不到您的数据并无法重现它,但我猜您的 DECIMAL/NUMERIC 列与第二个 SELECT 不兼容。检查它的最简单方法是注释两个语句中除一个之外的所有列,然后每次运行查询时取消注释一列。当您找到导致错误的列时使用:

    CAST(col_name AS type)  -- where type is broader type
    

    编辑:

    来自@dnoeth的评论: 可能您需要强制转换硬编码的0.00 AS BANK_AMT,它被视为DECIMAL(3,2)

    CAST(0.00 AS DECIMAL(18,2)) AS BANK_AMT
    

    来自@anwaar_hell评论和Teradata UNION

    所有与 UNION 组合的 SQL 语句都必须返回相同的 列数,此外,所有列的数据类型 参与的 select 语句必须匹配。 如果他们不这样做 匹配,第一个 SQL 选择语句的数据类型将是 另一个选择的相关列和不匹配列 语句将被隐式转换为相同的数据类型 第一个 select 语句有。

    请记住这一点,尤其是当您的列是字符数据类型时, 因为这可能会导致隐藏的文本列截断;这是一个 很难发现的问题。

    在 Oracle/SQL Server 等其他 RDBMS 中,数据类型被隐式转换为更广泛的类型。

    【讨论】:

    • 这是0.00 as BANK_AMT 导致DECIMAL(3,2),需要是CAST(0 AS DECIMAL(18,2))
    • 在 Oracle 和其他 RDMS 中添加一个点 .. 在进行联合时 ..database 会自动将较小的类型转换为较大的类型..但在 teradata 中,它将选择联合的上部选择中的内容。
    • @lad2025......感谢您的帮助。那成功了。我是一名贸易会计师,并且正在放慢使用 Teradata 进入 sql 的速度。感谢您花时间解释这一点,这很有帮助。
    • @Shaves 不客气。我来自 SQL Server 世界,这对我来说也有点令人惊讶。所以我也学到了一些新东西:)
    【解决方案2】:

    纠正这个

    CAST(0 AS DECIMAL(18,2))  for BANK_AMT 
    

    【讨论】:

    • @dnoeth ......感谢您的帮助。这些解释是一个宝贵的资源,因为我通过编写 sql 和在这样的论坛中研究问题来学习这一点。
    • @anwaar_hell..........感谢您的意见。当用户花时间向像我这样的新手解释事情时,它有助于我进一步理解
    • 查询正在运行。但是,我得到的是 2 行,而不是我对每条唯一记录所期望的 1 行。第一行在 GL_AMT 字段中为 0,在 Bank_AMT 字段中为金额,而第二行在 GL_AMT 字段中为金额,在 BANK_AMT 字段中为 0。我期待 UNION 合并这些记录,所以我在 GL_AMT 和 BANK_AMT 列中有 1 条记录。有什么我应该看看为什么记录没有被收集的原因吗?感谢您的帮助。
    • @Shaves ..你能粘贴你得到的输出吗..我相信每条记录本身都是独一无二的,因为在一个地方你提到 GL_AMT 为 0.00,在第二部分你提到 BANK_AMT 为 0.00 ....
    • @anwaar_hell .....谢谢.......我删除了一些列,这就是我目前看到的:17470 1013747 2ZG12A 553442 7812 100,755 0 25 17470 1013747 2ZG12A 553442 7812 100,755 25 0 这就是我想看到的: 17470 1013747 2ZG12A 553442 7812 100,755 25 25 联合的上半部分与下半部分相对于不同的表,我试图将其合并为 1 行。我把 0 放在每个部分。我认为我需要这样做,以便我可以使用联合并将它们组合在一起。谢谢您的帮助
    猜你喜欢
    • 2023-03-23
    • 2014-02-23
    • 2015-09-15
    • 2014-06-11
    • 2020-06-08
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多