【问题标题】:could not figure out the error in this teradata script无法找出此 teradata 脚本中的错误
【发布时间】:2012-04-24 04:41:43
【问题描述】:

脚本如下:

SELECT
   CAST(SUBSTR(TRIM(ABU_PTY_CD),4,2) AS CHAR(2)) ABU_PTY_CD,
   ACCTG_PRD_YR_CD,
   ACCTG_PRD_MO_CD ,

   CASE 
       WHEN (OUDS_FAC_CD > ' ' ) THEN CAST (SUBSTR(OUDS_FAC_CD, 1, 5) AS CHAR(5))
       ELSE CAST (COALESCE(CC_PTY_CD, '') AS CHAR(5)) 
   END OUDS_FAC_CD,

   CASE 
       WHEN GL_ACCT_NUM > ' ' THEN CAST (SUBSTR(GL_ACCT_NUM, 1, 12) AS CHAR(12)) 
       ELSE CAST (SAP_ACCT_NUM AS CHAR(12)) 
   END ACCT_NUM,

   CASE
       WHEN LE_PTY_CD > ' ' THEN CAST (LE_PTY_CD AS CHAR(4) )
       ELSE CAST (SUBSTR( COMP_PTY_CD, 1, 4) AS CHAR(4) )
   END COMP_PTY_CD,

   JE_LWR_TIER_RPTG_NUM, 
   LT2_NM, 

   CASE
       WHEN PRD_VAR_CD > ' ' THEN CAST (PRD_VAR_CD AS CHAR(3))
       ELSE CAST (COALESCE(FA_PTY_CD, '') AS CHAR(3))  
   END FA_PTY_CD,

   JE_LN_GLBL_CCY_CD, 
   JE_LN_LC_CD,

   CASE 
       WHEN GL_ACCT_LVL_NUM > ' ' THEN CAST(SUBSTR(GL_ACCT_LVL_NUM,1,10)  AS CHAR(11) ) 
       ELSE CAST(SUBSTR(FNCL_STMT_LN_NUM,1,11) AS CHAR(11) )
   END ACCT_LVL_NUM,

   SUM (JE_LN_GLBL_AMT) JE_LN_GLBL_AMT, 
   DDU_FAC_CD, 
   JE_HDR_DESC, 
   JE_HDR_NUM, 
   JE_GRP_NUM, 
   SOURCE_SYSTEM_ID
FROM   EDW_BI_SL_M1.BFV 
WHERE  CPC_PTY_CD = '00000000SX'
       AND TO_CHAR(RPTG_ACCTG_DT, 'YYYY')  >= TO_CHAR(ADD_MONTHS((CURRENT_DATE),-1),'YYYY')
       AND JE_VERS_NUM in ('200', '001') 
       AND SRC_LDGR_CD <> 'LG'
       AND ACCTG_PRD_MO_CD < 13
GROUP BY ABU_PTY_CD, ACCTG_PRD_YR_CD, ACCTG_PRD_MO_CD, OUDS_FAC_CD, ACCT_NUM, COMP_PTY_CD, JE_LWR_TIER_RPTG_NUM, 
LT2_NM, FA_PTY_CD, JE_LN_GLBL_CCY_CD, JE_LN_LC_CD, ACCT_LVL_NUM, JE_LN_GLBL_AMT, DDU_FAC_CD, JE_HDR_DESC, JE_HDR_NUM, JE_GRP_NUM, 
SOURCE_SYSTEM_ID;

错误信息:

3504: 选定的非聚合值必须是关联组的一部分

【问题讨论】:

  • 您使用的是 Teradata 还是 Oracle?

标签: sql oracle teradata


【解决方案1】:

您已在 GROUP BY 子句中包含 JE_LN_GLBL_AMT 列,但这是一个总和值。

【讨论】:

  • 不,这不是问题..我错误地添加了它,但我现在取消了它,但它仍然无法正常工作..我正在逐个测试它...我想出了什么是导致问题... CASE 语句导致问题.. 我正在尝试通过在此选择之外使用另一个选择来重写语句,并通过使用实际选择进行分组...如果您有任何其他想法..请通过您的想法在这里..谢谢
  • 哦,真的吗?哇,不知道 CASE 语句。听起来你走在正确的轨道上。
【解决方案2】:

您不能在同一查询的 GROUP BY 子句中使用您在此查询中创建的别名(至少在 Oracle 中)。您要么必须使用表达式:

...
GROUP BY
CAST(SUBSTR(TRIM(ABU_PTY_CD),4,2) AS CHAR(2)), 
..., 
CASE 
   WHEN GL_ACCT_LVL_NUM > ' ' THEN CAST(SUBSTR(GL_ACCT_LVL_NUM,1,10)  AS CHAR(11) ) 
   ELSE CAST(SUBSTR(FNCL_STMT_LN_NUM,1,11) AS CHAR(11) )
END, 
..., 
SOURCE_SYSTEM_ID

或创建一个子查询,然后使用您的别名进行分组:

SELECT ABU_PTY_CD, ...
FROM (
SELECT
   CAST(SUBSTR(TRIM(ABU_PTY_CD),4,2) AS CHAR(2)) ABU_PTY_CD,
   ...
FROM   EDW_BI_SL_M1.BFV 
WHERE  CPC_PTY_CD = '00000000SX'
       AND TO_CHAR(RPTG_ACCTG_DT, 'YYYY')  >= TO_CHAR(ADD_MONTHS((CURRENT_DATE),-1),'YYYY')
       AND JE_VERS_NUM in ('200', '001') 
       AND SRC_LDGR_CD <> 'LG'
       AND ACCTG_PRD_MO_CD < 13
)
GROUP BY ABU_PTY_CD, ACCTG_PRD_YR_CD, ACCTG_PRD_MO_CD, OUDS_FAC_CD, ACCT_NUM, COMP_PTY_CD, JE_LWR_TIER_RPTG_NUM, 
LT2_NM, FA_PTY_CD, JE_LN_GLBL_CCY_CD, JE_LN_LC_CD, ACCT_LVL_NUM, JE_LN_GLBL_AMT, DDU_FAC_CD, JE_HDR_DESC, JE_HDR_NUM, JE_GRP_NUM, 
SOURCE_SYSTEM_ID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2015-09-08
    • 2019-05-11
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多