Условно используйте CASE ... WHEN - Oracle SQL - PullRequest
1 голос
/ 30 сентября 2019

У меня есть две таблицы, например, так:

tblOrders: OrderNo (pk), CurrentStepNo (fk)

tblSteps: StepNo (pk), OrderNo(fk), StepName, StepType, StepStart, StepStop

tblOrders содержит тонны информации о наших заказах на продажу, а tblSteps содержит тонны информации о соответствующих последовательных шагах, необходимых для построенияматериал, который мы продаем.

Я пытаюсь создать запрос, который следует этой логике:

"Для всех заказов выберите имя текущего шага из таблицы шагов. Если шагТип равен 'XO', затем выберите последний завершенный (где StepStop не равен NULL) обычный шаг (где StepStop равен "YY") "

У меня есть следующий запрос:

SELECT
    tblOrders.*,
    tblSteps.StepName    
FROM
    tblOrders
        INNER JOIN tblSteps 
                ON tblOrders.OrderNo = tblSteps.OrderNo
               AND tblOrders.CurrentStepNo = tblSteps.StepNo

, который успешно возвращает мне текущее имя шага для незавершенного заказа. Что мне нужно сделать, так это когда tblOrders.CurrentStepNo имеет тип 'XO', чтобы найти MAX(tblSteps.StepStop) WHERE tblSteps.StepType = 'YY'. Однако у меня возникли проблемы с введением этой логики в мой уже работающий запрос.

Примечание. Извините за отсутствие примеров данных в этом примере. Я обычно отправляю, но не могу в этом случае. Это также не домашний вопрос.

Я рассмотрел эти ссылки:

Случай в утверждении Select *

https://blogs.msdn.microsoft.com/craigfr/2006/08/23/subqueries-in-case-expressions/

Но пока не повезло.

Я пробовал это:

SELECT
    tblOrders.*,
    CASE
        WHEN tblSteps.StepType = 'XO' THEN (-- Some logic here)
        ELSE tblSteps.StepName
        END AS StepName    
 FROM
    tblOrders
        INNER JOIN tblSteps 
                ON tblOrders.OrderNo = tblSteps.OrderNo
               AND tblOrders.CurrentStepNo = tblSteps.StepNo

Но я пытаюсь правильно сформулировать логику

1 Ответ

2 голосов
/ 30 сентября 2019

Присоединяйтесь ко всем шагам, оцените их как ROW_NUMBER и оставайтесь с лучшим рейтингом:

select *
from
(
  select
    o.*,
    s.*,
    row_number() over 
      (partition by o.orderno
       order by case when s.steptype <> 'XO' and s.stepno = o.currentstepno then 1
                     when s.steptype <> 'YY' then 2
                     else 3 end, s.stepstop desc nulls last) as rn
  from tblorders o
  join tblsteps s on s.orderno = o.orderno
) ranked
where rn = 1
order by orderno;
...