2014-10-13 3 views
1

Я пытаюсь вычислить отношение двух сумм, одна из которых имеют пункт where, поэтому я решил использовать подзапросы:ORA-00936: отсутствует выражение, хотя, кажется, нет недостающего выражения (SQL)

select round(100.0*credit.luotot/all.kaikki) as CPROS 
from 
(select sum(ordered.totalprice) as kaikki from ordered) all, 
(select sum(ordered.totalprice) as luotot from ordered where ordered.paymentby = 'credit') credit 

Однако выполнение этого запроса бросает

ORA-00936: отсутствует выражение

, и я не понимаю, почему.

+0

ALL - зарезервированное слово –

ответ

3

all является reserved word в . Вы должны использовать имя, которое не, например, all_ordered:

select round(100.0*credit.luotot/all_ordered.kaikki) as CPROS 
from 
(select sum(ordered.totalprice) as kaikki from ordered) all_ordered, 
(select sum(ordered.totalprice) as luotot from ordered where ordered.paymentby = 'credit') credit 

EDIT:
BTW, вы можете достичь желаемого результата с выражением case так что вам не нужно будет использовать подзапросы:

SELECT ROUND(100.0 * 
       SUM(totalprice)/
       SUM(CASE paymentby 
        WHEN 'credit' THEN totalprice 
        ELSE 0 END) as CPROS 
FROM ordered 
1

Вы не можете использовать ALL как ALIAS таким образом. Измените его на что-то другое:

SELECT round(100.0*credit.luotot/total.kaikki) AS cpros 
FROM ( 
       SELECT SUM(ORDERED.totalprice) AS kaikki 
       FROM ordered) total, 
     ( 
       SELECT SUM(ordered.totalprice) AS luotot 
       FROM ORDERED 
       WHERE ordered.paymentby = 'credit') credit 
/

ALL является зарезервированным словом в Oracle. Это условие сравнения используется для сравнения значения со списком или подзапросом.

Кроме того, вы должны использовать subquery factoring то есть в пункте WITH, а не переопределение подзапросов несколько раз. Прочитано http://www.oracle-base.com/articles/misc/with-clause.php

Смежные вопросы