如何在Oracle SQL查询中汇总列?

时间:2016-12-29 20:28:20

标签: sql oracle oracle11g

我有一个查询要在Ms Access中获取特定报告。这个查询恢复了读取数据的设备的操作,给它" 1/2"这意味着半分钟,或0根据情况,并总结线。

现在我必须在Oracle BD上使用它。除了以下几行之外,我几乎翻译了所有内容:

Inoperante + standby as parado,

出于某种原因,我无法使用他们的名字对我选择的coluns求和。在Oracle中有没有特定的方法呢?

有整个查询:(业余人员,不要笑笑)

SELECT 

TO_CHAR(e3timestamp,'DD/MM/YYYY') as Data,

SUM(
 (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 0 ELSE 
  (CASE WHEN ARAUCARIA.Status=0 THEN 0 ELSE
   (CASE WHEN ARAUCARIA.SB=1 THEN 0 ELSE
(CASE WHEN ARAUCARIA.VAZÃO=0 OR ARAUCARIA.VAZÃO=NULL THEN
 (CASE WHEN ARAUCARIA.[Tempo por Stroke]>15 THEN 0 ELSE 1/2 END)
ELSE
 (CASE WHEN ARAUCARIA.[Quantidade inejtada]<10 THEN 0 ELSE 1/2 END)
END)
   END)
  END)
 END)
)
AS Operando,

SUM((CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 1/2 ELSE 0 END)) AS TSP,

SUM(
 (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]>50 THEN 
  (CASE WHEN ARAUCARIA.Status=0 THEN 1/2 ELSE 0 END)
 ELSE 0 END)
) AS Inoperante,

SUM(
 (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]>50 THEN
  (CASE WHEN ARAUCARIA.SB=1 THEN 1/2 ELSE 0 END)
 ELSE 0 END)
) AS standby,

--Inoperante + standby as parado,

SUM(
 (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 0 ELSE
  (CASE WHEN ARAUCARIA.Status=0 THEN 0 ELSE
   (CASE WHEN ARAUCARIA.SB=1 THEN 0 ELSE
    (CASE WHEN ARAUCARIA.VAZÃO=0 OR ARAUCARIA.VAZÃO=NULL THEN
     (CASE WHEN ARAUCARIA.[Tempo por Stroke]>15 THEN 1/2 ELSE 0 END)
    ELSE
     (CASE WHEN ARAUCARIA.[Quantidade inejtada]<10 THEN 1/2 ELSE 0 END)
    END)
   END)
  END)
 END)
) AS Inadequada,

--Operando + TSP + Inadequada + Inoperante + standby as Total

FROM ARAUCARIA

--WHERE ARAUCARIA.E3TIMESTAMP BETWEEN  #<%DateIniMed1%>#  AND  #<%DateFimMed1%>#

GROUP BY TO_CHAR(e3timestamp,'DD/MM/YYYY')

1 个答案:

答案 0 :(得分:3)

无法在SAME选择中引用select中使用的列别名。你要么

  1. 拼出列
  2. 的整个公式
  3. 使用子查询
  4. 使用公用表表达式(CTE)
  5. 作为CTE:

    With CTE AS (
    SELECT 
    
    TO_CHAR(e3timestamp,'DD/MM/YYYY') as Data,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 0 ELSE 
      (CASE WHEN ARAUCARIA.Status=0 THEN 0 ELSE
       (CASE WHEN ARAUCARIA.SB=1 THEN 0 ELSE
    (CASE WHEN ARAUCARIA.VAZÃO=0 OR ARAUCARIA.VAZÃO=NULL THEN
     (CASE WHEN ARAUCARIA.[Tempo por Stroke]>15 THEN 0 ELSE 1/2 END)
    ELSE
     (CASE WHEN ARAUCARIA.[Quantidade inejtada]<10 THEN 0 ELSE 1/2 END)
    END)
       END)
      END)
     END)
    )
    AS Operando,
    
    SUM((CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 1/2 ELSE 0 END)) AS TSP,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]>50 THEN 
      (CASE WHEN ARAUCARIA.Status=0 THEN 1/2 ELSE 0 END)
     ELSE 0 END)
    ) AS Inoperante,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]>50 THEN
      (CASE WHEN ARAUCARIA.SB=1 THEN 1/2 ELSE 0 END)
     ELSE 0 END)
    ) AS standby,
    
    --Inoperante + standby as parado,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 0 ELSE
      (CASE WHEN ARAUCARIA.Status=0 THEN 0 ELSE
       (CASE WHEN ARAUCARIA.SB=1 THEN 0 ELSE
        (CASE WHEN ARAUCARIA.VAZÃO=0 OR ARAUCARIA.VAZÃO=NULL THEN
         (CASE WHEN ARAUCARIA.[Tempo por Stroke]>15 THEN 1/2 ELSE 0 END)
        ELSE
         (CASE WHEN ARAUCARIA.[Quantidade inejtada]<10 THEN 1/2 ELSE 0 END)
        END)
       END)
      END)
     END)
    ) AS Inadequada,
    
    --Operando + TSP + Inadequada + Inoperante + standby as Total
    
    FROM ARAUCARIA
    
    --WHERE ARAUCARIA.E3TIMESTAMP BETWEEN  #<%DateIniMed1%>#  AND  #<%DateFimMed1%>#
    
    GROUP BY TO_CHAR(e3timestamp,'DD/MM/YYYY'))
    
    SELECT c.*
         , Inoperante + standby as parado
         , Operando + TSP + Inadequada + Inoperante + standby as Total
    FROM cte C
    

    作为子查询:

    SELECT c.*
         , Inoperante + standby as parado
         , Operando + TSP + Inadequada + Inoperante + standby as Total
    FROM (SELECT TO_CHAR(e3timestamp,'DD/MM/YYYY') as Data,
          SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 0 ELSE 
      (CASE WHEN ARAUCARIA.Status=0 THEN 0 ELSE
       (CASE WHEN ARAUCARIA.SB=1 THEN 0 ELSE
    (CASE WHEN ARAUCARIA.VAZÃO=0 OR ARAUCARIA.VAZÃO=NULL THEN
     (CASE WHEN ARAUCARIA.[Tempo por Stroke]>15 THEN 0 ELSE 1/2 END)
    ELSE
     (CASE WHEN ARAUCARIA.[Quantidade inejtada]<10 THEN 0 ELSE 1/2 END)
    END)
       END)
      END)
     END)
    )
    AS Operando,
    
    SUM((CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 1/2 ELSE 0 END)) AS TSP,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]>50 THEN 
      (CASE WHEN ARAUCARIA.Status=0 THEN 1/2 ELSE 0 END)
     ELSE 0 END)
    ) AS Inoperante,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]>50 THEN
      (CASE WHEN ARAUCARIA.SB=1 THEN 1/2 ELSE 0 END)
     ELSE 0 END)
    ) AS standby,
    
    --Inoperante + standby as parado,
    
    SUM(
     (CASE WHEN ARAUCARIA.[Tempo por Stroke_Quality]<50 THEN 0 ELSE
      (CASE WHEN ARAUCARIA.Status=0 THEN 0 ELSE
       (CASE WHEN ARAUCARIA.SB=1 THEN 0 ELSE
        (CASE WHEN ARAUCARIA.VAZÃO=0 OR ARAUCARIA.VAZÃO=NULL THEN
         (CASE WHEN ARAUCARIA.[Tempo por Stroke]>15 THEN 1/2 ELSE 0 END)
        ELSE
         (CASE WHEN ARAUCARIA.[Quantidade inejtada]<10 THEN 1/2 ELSE 0 END)
        END)
       END)
      END)
     END)
    ) AS Inadequada,
    
    --Operando + TSP + Inadequada + Inoperante + standby as Total
    
    FROM ARAUCARIA
    
    --WHERE ARAUCARIA.E3TIMESTAMP BETWEEN  #<%DateIniMed1%>#  AND  #<%DateFimMed1%>#
    
    GROUP BY TO_CHAR(e3timestamp,'DD/MM/YYYY')) C
    

    我会让你弄清楚复制公式一:P