Sql 不知道为什么会说“列定义模糊”

Sql 不知道为什么会说“列定义模糊”,sql,oracle,Sql,Oracle,我对这个专栏的定义一直模糊不清 WITH CountData as ( SELECT BOARD_RATE_T1, BOARD_RATE_T3, RENTAL_START_DATE, RENTAL_END_DATE, (BOARD_RATE_T3 - BOARD_RATE_T1) AS Countt FROM PPSS.PA_OA_RATE_JUST ), GroupCount AS ( SELECT BOARD

我对这个专栏的定义一直模糊不清

WITH CountData as (
  SELECT BOARD_RATE_T1,
         BOARD_RATE_T3,
         RENTAL_START_DATE,
         RENTAL_END_DATE,
         (BOARD_RATE_T3 - BOARD_RATE_T1) AS Countt
  FROM PPSS.PA_OA_RATE_JUST
),
GroupCount AS
(
  SELECT BOARD_RATE_T1,
         BOARD_RATE_T3,
         Countt,
         CASE
             WHEN Countt < 500 THEN 'Under 500'
             WHEN Countt BETWEEN 500 AND 5000 THEN '500 - 5000'
             WHEN Countt BETWEEN 5000 AND 10000 THEN '5000 - 10000'
             WHEN Countt > 10000 THEN 'Over 10000'
             ELSE 'Invalid Count'
         END AS Countt
  FROM CountData
)
SELECT COUNT(*) AS CountGrpCount,
      Countt Groups
FROM GroupCount;

最后一个查询抛出错误,因为您正在引用COUNT,并且它在GroupCount中定义了两次。甲骨文不知道你指的是哪一个

一旦通过了不明确的列错误,最终查询就会出现问题。Oracle严格要求聚合查询中的每个非聚合值都使用GROUP BY,这与MySQL不同。也有例外,比如常数和SYSDATE函数,但这超出了这个问题的范围

如果您试图将计数设置为低于500、500-5000等,那么我注意到以下几点:

您不需要BOARD_RATE_T1、BOARD_RATE_T2、RENTAL_START_DATE和RENTAL_END_DATE列

通过稍微更改逻辑,可以缩短Rate Difference category CASE语句,并使其不易出错

在CASE语句中,您将命中ELSE条件的唯一方法是BOARD_RATE_T1和/或BOARD_RATE_T3是否为null。如果它们都是必需的非空值,则可以省略ELSE

此查询将给出计数。如果您确实需要其他值并将其删掉以缩短问题,我深表歉意:

WITH CountData AS (
  SELECT BOARD_RATE_T3 - BOARD_RATE_T1 AS RateDiff
  FROM PPSS.PA_OA_RATE_JUST
),
GroupCount AS (
  SELECT
    CASE
      WHEN RateDiff < 500 THEN 'Under 500'
      WHEN RateDiff < 5000 THEN '500 - 5000'
      WHEN RateDiff < 10000 THEN '5000 - 10000'
      ELSE 'Invalid Count'
    END AS RateDiffCategory
  FROM CountData
)
SELECT
  RateDiffCategory,
  COUNT(*)
FROM GroupCount
GROUP BY
  RateDiffCategory
ORDER BY
  RateDiffCategory

因为您在GroupCount中定义了两次COUNTT。这只是一个猜测。Gordon几乎是这么说的——除了在GROUPCOUNT的SELECT列表中,您只定义了一次COUNT作为大小写表达式的结果,并且您还包括了前面CTE中的COUNT列(名称相同)。另外,请注意,BETWEEN表示两端的非严格不等式。对于编写的CASE表达式,值正好为5000将落在500-5000范围内,这仅仅是因为CASE中的条件是按照写入顺序进行计算的,但对于其他用途,请记住这一点。在大多数情况下,如果复合条件中有多个BETWEEN条件与AND或or运算符组合在一起,则几乎肯定有问题。我需要根据定义的case逻辑组织表中的记录。mathguy所说的:“500-5000”和“5000-10000”都包括值5000。那么,对于值5000,您希望得到什么结果?到目前为止,“500-5000”赢了——仅仅因为它在案例表达中排名第一。