2016-12-14 3 views
-3

Мне нужно перевести следующий запрос, который выполняется в SQL Server для Oracle.Вычисленное значение поля в запросе SQL

SELECT 
    LABEL_A, LABEL_B, 
    CASE 
     WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
     WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
     WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
     WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
    END AS L, 
    QTY 
FROM 
    DATA 
WHERE 
    PRICE > 0 AND E_DATE >= getdate()-1) AS LS 
GROUP BY 
    LABEL_A, LABEL_B, L 
HAVING 
    SUM(QTY/100) >= 150 

Не могли бы Вы помочь мне?

Спасибо.

+0

Просьба опубликовать то, что вы пробовали до сих пор, и вопрос, который у вас есть – Aleksej

+3

Выполняется ли этот запрос с SQL Server? – jarlh

+0

За исключением опечаток в предложении 'WHERE', я бы заменил' getdate() 'на' sysdate', и все должно быть в порядке. – gmiley

ответ

3

Основная проблема при переносе из SQL Server в Oracle является то, что последний не позволяет псевдонимы в SELECT заявлении, которые будут использоваться в предложении GROUP BY. Но вместо повторения длинного выражения CASE мы можем использовать подзапрос, чтобы его повторно использовать.

SELECT t.LABEL_A, 
     t.LABEL_B, 
     t.L, 
     SUM(t.QTY) AS QTY 
FROM 
(
    SELECT LABEL_A, 
      LABEL_B, 
      CASE WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
       WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
       WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
       WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
      END AS L, 
      QTY 
    FROM DATA 
    WHERE PRICE > 0 AND E_DATE >= SYSDATE - 1 
) t 
GROUP BY t.LABEL_A, t.LABEL_B, t.L 
HAVING SUM(t.QTY)/100 >= 150 
+0

Это все еще имеет непревзойденную ')' скобку во внутреннем предложении WHERE. – MT0

+0

Это также можно сделать в 'CTE' с предыдущим оператором' WITH'. Они обычно делают вещи более читаемыми. По крайней мере, ИМО. – gmiley

+0

@gmiley, и я нахожу эту производную таблицу немного более удобочитаемой. Просто вопрос вкуса. – jarlh

1

В этой строке:

WHERE PRICE > 0 AND E_DATE] >= getdate()-1) AS LS 

удалить здесь ] и ) (которые являются недопустимыми в MS тоже) и заменить getDate() с sysdate. Отдых должен быть в порядке, кроме группы, который должен заменить L целым CASE.

+0

Также добавлен дополнительный закрытый символ ')' в предложении where. – gmiley

+0

@gmiley yes Я добавлю это – Kacper

+0

Он упоминает 'sysdate' в тексте, это просто не в верхнем примере. – gmiley

3

Большинства ошибок в этой строке:

WHERE PRICE > 0 AND E_DATE] >= getdate()-1) AS LS 

У вас есть дополнительные ] и ) символы и getdate() заменяется SYSDATE и вам необходимо удалить псевдоним в конце строки. Кроме того, вы не можете использовать псевдоним столбца в предложении GROUP BY и должны использовать весь оператор case (или обернуть его в подзапрос).

У вас также есть проблема, что QTY не является частью статьи GROUP BY.

SELECT LABEL_A, 
     LABEL_B, 
     CASE 
     WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
     WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
     WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
     WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
     END AS L, 
     SUM(QTY) AS QTY 
FROM DATA 
WHERE PRICE > 0 
AND E_DATE >= SYSDATE-1 
GROUP BY 
     LABEL_A, 
     LABEL_B, 
     CASE 
     WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
     WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
     WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
     WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
     END 
HAVING SUM(QTY/100) >= 150 
+0

Вместо повторения выражения case в GROUP BY, я бы обернул запрос в производную таблицу. – jarlh

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