Сложный запрос Oracle ORDER BY - PullRequest
0 голосов
/ 27 ноября 2018

У нас сложный SQL-запрос, включающий несколько представлений, разделов, поток управления и т. Д. В конечном итоге мы ожидаем, что сможем вернуть валовую стоимость и стоимость линии в одной строке;оба эти столбца были ранее разделены на базовые представления, что успешно предотвращает дублирование.Ниже приведен пример:

PO Number    Gross Cost    Line #    Line Cost    Inv #    Inv Cost
      10          10000         1        10000        1        2000
      10                        1                     2        3000
      10                        1                     3        5000

Вместо этого мы получаем:

PO Number    Gross Cost    Line #    Line Cost    Inv #    Inv Cost
      10          10000         1                     1        2000
      10                        1                     2        3000
      10                        1        10000        3        5000

Или, используя ORDER BY table.gross_cost, table.line_cost, мы получаем:

PO Number    Gross Cost    Line #    Line Cost    Inv #    Inv Cost
      10          10000         1                     1        2000
      10                        1         10000       2        3000
      10                        1                     3        5000

Наоборот, если переключить ORDER BY на table.line_cost, table.gross_cost, мы получим:

PO Number    Gross Cost    Line #    Line Cost    Inv #    Inv Cost
      10                        1        10000        1        2000
      10          10000         1                     2        3000
      10                        1                     3        5000

Надеюсь, это имеет смысл.Есть ли какой-нибудь способ, которым мы можем получить первый пример таблицы с помощью предложения ORDER BY, или мы должны идти по маршруту GROUP BY?Я даже пытался создать столбец Order с помощью оператора CASE WHEN, но это также не сработало.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы, кажется, хотите что-то вроде этого:

select . . .,
       (case when inv = 1 then sum(gross) over (partition by po_number) end) as gross,
       (case when inv = 1 then sum(line) over (partition by po_number) end) as line
from t
order by po_number, inv;

Это не проблема order by, потому что вам нужно переместить данные в строки с первым счетом.

...