2016-12-29 3 views
0

У меня возник вопрос, чтобы получить конкретный отчет в Ms Access. Этот запрос возобновляет работу устройства, считывающего данные, давая ему «1/2», что означает полминуты, или 0 в зависимости от ситуации, и суммирование строк.Как суммировать столбцы в Oracle SQL Query?

Теперь я должен использовать его на Oracle BD. Я сделал перевод почти Everyting для следующей строки, за исключением:

Inoperante + standby as parado, 

По некоторым причинам я не могу просуммировать coluns, что я выбрал, используя их имена. Есть ли определенный способ сделать это в Oracle?

Существует весь запрос: (Amateur здесь, не смейтесь лолами)

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') 

ответ

3

Один не может ссылаться на столбцы псевдонима, используемый в избранном в SAME выберите. Вы должны либо

  1. изложить всю формулу для столбца
  2. использовать подзапрос
  3. использовать Common Table Expression (КТР)

как КТР:

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

+0

Я знал, что могу написать всю формулу, но запрос уже большой для меня. Второе решение (** подзапрос **) работало хорошо, я думаю, что смогу переформулировать все с этим. Третье решение (** CTE **) не сработало для меня. Я пытаюсь понять, почему, но результат всегда пуст, даже в простейших выражениях CTE. –