【问题标题】:group by function issue when using sum statement使用 sum 语句时按函数分组问题
【发布时间】:2019-05-23 02:47:17
【问题描述】:

我在 case when 语句中添加了 sum 语句,它触发了 ORA-00937: not a single-group group function 错误。

 SELECT DISTINCT abc_value,
           COUNT (*) AS num_abc_values
    from   (
     select dsp_sku,
     sum(case
        when EXPTD_QTY <> ACTL_INVN_QTY then (EXPTD_QTY-ACTL_INVN_QTY)*(-1)
        else null
      end) as "Variance_"
    ,decode (cc.stat_code, '0', 'Unprocessed', '90', 'Processed', '99', 'Expired') as Status,
    trunc(cc.create_date_time) CC_date,
      case
        when dsp_sku = 'EGIA60AMT' then 'A'
        when dsp_sku = 'LF1937' then 'A'
        when dsp_sku = '980X3ENDIUU' then 'A'
        when dsp_sku = '186-0106' then 'A'
        when dsp_sku = 'PM35MN02' then 'A'
     when dsp_sku = 'SIGC60MT' then 'B'
        when dsp_sku = 'GS833' then 'B'
        when dsp_sku = '5.5 PED' then 'B'
        when dsp_sku = 'L74' then 'B'
        when dsp_sku = 'VLOCL2105' then 'B'
        when dsp_sku = 'VLOCM0134' then 'C'
        when dsp_sku = '8886471021V' then 'C'
        when dsp_sku = 'SILSCLINCH46' then 'C'
     when dsp_sku = 'YCN1800P' then 'D'
        when dsp_sku = 'YCN1801P' then 'D'
        when dsp_sku = 'Y-REFACH-X-E' then 'D'
        when dsp_sku = 'ZL7777-0091' then 'D'
        else 'Empty Location'
      end as ABC_Value
    from WH_GHC1.CYCLE_COUNT_HIST cc
      left join item_master im on
        im.sku_id = cc.sku_id
      inner join locn_hdr lh on
        lh.locn_id = cc.locn_id
    where
      cc.whse = 'PH3'
      --and cc.stat_code in ('0','90') --stat_code: 0 is unprocessed, 90 is processed, 99 is expired
      and cc.stat_code = 90
      --and cc.stat_code = 0
      --and cc.create_date_time between '&FromDate' and '&EndDate'

      and cc.create_date_time between '&FromDate' and '&ToDate'
    --and dsp_sku = '&SKU'
      --and not im.srl_nbr_reqd = 4
      --and EXPTD_QTY = 0
      --and actl_invn_qty = 0
      )
    GROUP BY ABC_Value, Dsp_sku
    --having count (Variance_) <>0;

我尝试重新编写我的 group by,添加到 group by,摆脱它,但都没有运气......

我目前有它计算 ABC 的值...我希望它然后将 ABC 的差异量相加。我相信 sum 语句是正确的,但会触发 ORA 错误...有什么建议吗...?

【问题讨论】:

  • 您的子查询有一个聚合函数sum(case when exptd_qty...),但没有group by 子句。
  • 我写这篇评论是因为我还不完全确定,但我相信你的 group by 应该包括你的整个 decode 语句。并且应该在子查询内
  • 查询现在有效,但它为每个方差创建一行。它为每个数量和差异量做了一行,我希望它只是告诉我有多少。比如 a 的 5 个方差和 b 的 2 个方差,依此类推。有什么建议...?

标签: sql oracle


【解决方案1】:

我已经调整并添加了 cmets 到您的脚本中。可能这不会直接为您提供所需的输出(您需要进行更多调整),但这会引导您前往目的地:)

SELECT 
abc_value, --No DISTINCT required 
COUNT (*) AS num_abc_values,
SUM(Variance_) AS Variance_
FROM  
(
    SELECT 

    --dsp_sku,
    --SUM
    --(
    CASE
        WHEN EXPTD_QTY <> ACTL_INVN_QTY THEN (EXPTD_QTY-ACTL_INVN_QTY)*(-1)
        ELSE NULL
    END AS 'Variance_',
    --decode (cc.stat_code, '0', 'Unprocessed', '90', 'Processed', '99', 'Expired') as Status,
    --trunc(cc.create_date_time) CC_date,

    -- All above columns:  dsp_sku, Variance_, Status, CC_date has no impace on the Final output
    --So you can exclude them from the selection

    CASE
        WHEN dsp_sku IN('EGIA60AMT','LF1937','980X3ENDIUU','186-0106','PM35MN02') THEN 'A'
        WHEN dsp_sku IN ('SIGC60MT','GS833','5.5 PED','L74','VLOCL2105') THEN 'B'
        WHEN dsp_sku IN ('VLOCM0134','8886471021V','SILSCLINCH46') THEN 'C'
        WHEN dsp_sku IN ('YCN1800P','YCN1801P','Y-REFACH-X-E','ZL7777-0091') then 'D'
        ELSE 'Empty Location'
    END AS ABC_Value
    -- You can use IN operator instead of checking all values one by one.

    FROM WH_GHC1.CYCLE_COUNT_HIST cc
    LEFT JOIN item_master im 
        ON im.sku_id = cc.sku_id
    INNER JOIN locn_hdr lh 
        ON lh.locn_id = cc.locn_id
    WHERE
    cc.whse = 'PH3'
    AND cc.stat_code = 90
    AND cc.create_date_time BETWEEN '&FromDate' AND '&ToDate'
)
GROUP BY ABC_Value
--, Dsp_sku  
-- This group by is unnecessary as ABC_Value already created from this column's value

【讨论】:

  • 我有一种情况,当语句 CASE -- WHEN EXPTD_QTY ACTL_INVN_QTY THEN (EXPTD_QTY-ACTL_INVN_QTY)*(-1) -- ELSE NULL -- END 计算计算数量的差异,我想让它把字母 a b c d 的数量加起来......这会起作用吗?
  • 是的,在子查询中没有 SUM 的情况下应该可以工作。然后,如果最终选择中需要,您可以在“Variance_”上应用 SUM - SELECT abc_value, COUNT (*) AS num_abc_values, SUM(Variance_)
  • 它为每个字母返回多行,然后是字母的实际差异数量,我们可以让它只对字母的差异量求和吗?像 a 有 5 个方差,依此类推... C 21 21 C 1 -1044 A 14 -14 C 1 330 C 2 80 D 8 8 B 2 -40 C 1 -18 A 1 8 空位置 1 -67 C 1 972 C 1 -21 C 1 110
  • 把所有这些数字想象成表格形式,哈哈……他们不会正确粘贴
  • 我对代码做了一些改动。检查这是否有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2018-11-08
  • 2021-10-23
相关资源
最近更新 更多