【问题标题】:Oracle SQL how to get around group by clause within a case whenOracle SQL如何在一个案例中绕过group by子句
【发布时间】:2015-03-24 17:23:52
【问题描述】:

由于必须对特定字段使用 GROUP BY,因为它位于 CASE WHEN 子句中,因此我无法返回唯一记录。这是查询:

SELECT L.COLUMN1                 AS COL1,
ROUND(L.COLUMN2 * 1000) AS COL2,
CASE
  WHEN L.COLUMN3 >= 20 AND L.COLUMN4 = 3
  THEN 'Y'
  ELSE 'N'
END AS COMPLETED,
CASE
  WHEN COUNT(DISTINCT VC.COLUMN5)= 0
  OR (COUNT(DISTINCT VC.COLUMN5) > 0
  AND SUM(VC.COLUMN10)              =SUM(VC.COLUMN11))
  THEN 'Y'
  WHEN COUNT(DISTINCT VC.COLUMN5) > 0      
  AND SUM(VC.COLUMN10)             <>SUM(VC.COLUMN11)
  AND VC.COLUMN8 IN (SELECT S.CODE_ID FROM TABLE5 S
  WHERE S.COLUMN6 = 'C' AND S.COLUMN7 = 'SVS')
  THEN 'S'
  ELSE 'N'
END AS YNS,
NVL(
CASE
 WHEN COUNT(DISTINCT LL.COLUMN12)> 0
 THEN 'N'
 ELSE 'Y'
 END,'Y') AS YN
FROM TABLE1 L
 LEFT OUTER JOIN TABLE2 VC
 ON L.COLUMN1 = VC.COLUMN5
 LEFT OUTER JOIN TABLE3 LL
 ON L.COLUMN9 = LL.COLUMN9
 AND LL.COLUMN1 = L.COLUMN1
WHERE L.OIIN='O'
 AND L.COLUMN3 < 90
GROUP BY L.COLUMN1,
 L.COLUMN2 ,
 L.COLUMN3,
 L.COLUMN4, 
 VC.COLUMN8;

这里导致重复的部分是

WHEN COUNT(DISTINCT VC.COLUMN5) > 0      
  AND SUM(VC.COLUMN10)             <>SUM(VC.COLUMN11)
  AND VC.COLUMN8 IN (SELECT S.CODE_ID FROM TABLE5 S
  WHERE S.COLUMN6 = 'C' AND S.COLUMN7 = 'SVS')
  THEN 'S'

因为它的末尾有 GROUP BY VC.COLUMN8。如果我删除该组,那么我会收到错误,即这不是按表达式分组。如果 COL1 的任何记录符合以下要求,我如何删除组并仅返回表中 COL1 的唯一记录,在该表中我仍然会填充“S”?

WHEN COUNT(DISTINCT VC.COLUMN5) > 0      
  AND SUM(VC.COLUMN10)             <>SUM(VC.COLUMN11)
  AND VC.COLUMN8 IN (SELECT S.CODE_ID FROM TABLE5 S
  WHERE S.COLUMN6 = 'C' AND S.COLUMN7 = 'SVS')
  THEN 'S'

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您应该了解,在 GROUP BY 子句中没有 VC.COLUMN8 的查询中,查询的每个输出行可能有多个 VC.COLUMN8 值。因此查询无法解析 VC.COLUMN8 是否在子查询定义的列表中。

    您必须解决这个逻辑问题才能知道如何继续 - 您的意思是测试子查询中是否至少有一个 VC.COLUMN8 值,或者所有这些值都必须是在子查询中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2022-01-13
      • 1970-01-01
      • 2019-05-17
      • 2022-09-29
      相关资源
      最近更新 更多