Как отображать строки во вложенном формате, когда совпадает несколько строк с оракулом таблицы связывания - PullRequest
0 голосов
/ 20 ноября 2018

Таблица 1: Доход

st_id, st_date,  st_sl, income_amount
-------------------------------------
12   11/11/2018   1    100
12   11/11/2018   2    10
13   11/11/2018   1    50

Таблица 2: Util

util_date, serial_no, st_id, st_date, st_sl, util_amount
----------------------------------------------------------
12/11/2018     1       12    11/11/2018  1    20
12/11/2018     2       12    11/11/2018  1    50
13/11/2018     1       12    11/11/2018  1    30
12/11/2018     1       13    11/11/2018  1    50

Я хочу получить результат как:

st_id, st_date,  st_sl, income_amount, util_date, util_amount
---------------------------------------------------------------
12      11/11/2018   1        100        12/11/2018     20
                                         12/11/2018     50
                                         12/11/2018     30
12      11/11/2018   2         10           null       null
13      11/11/2018   1         50        12/11/2018     50

Я хочу одну строку изТаблица 1, когда таблица ссылок имеет несколько совпадающих строк.как выше.

Какой может быть запрос для достижения такого типа результата?Пожалуйста, помогите.

Приведенный ниже запрос является обычным SQL-запросом для связывания двух таблиц.Он выдает дубликаты записей из таблицы Income (означает повторение одной строки из-за ссылки на таблицу Income в двух строках таблицы Util).Но я хочу одну строку из таблицы доходов и несколько строк из таблицы Util, как в примере выше.

select st_id, st_date, st_sl, income_amount, util_date, util_amount
  from income i, util u
 where i.st_id = u.st_id
   and i.st_date = u.st_date
   and i.st_sl = u.st_sl;

1 Ответ

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

Правильный запрос для отображения нужных вам данных должен быть

select st_id, st_date, st_sl, income_amount, util_date, util_amount
  from income i 
  left join util u on 
         i.st_id = u.st_id
     and i.st_date = u.st_date
     and i.st_sl = u.st_sl;

Обратите внимание на левые в условии соединения.

Но вы хотите, чтобы эти "дублирующие" строки дохода были подавленыв один ряд.Это можно сделать несколькими способами, но одна из них будет выглядеть следующим образом:

select case when util.serial_no = 1 then i.st_id end as st_id, 
       case when util.serial_no = 1 then i.st_date end as st_date, 
       case when util.serial_no = 1 then i.st_sl end as st_sl, 
       income_amount, 
       util_date, 
       util_amount
  from income i 
  left join util u on 
         i.st_id = u.st_id
     and i.st_date = u.st_date
     and i.st_sl = u.st_sl;

ОБНОВЛЕНИЕ1:

По мере изменения образца данных и объяснения, другой запрос для соответствиязапрос будет:

select 
  case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1 
     then i.st_id 
  end as st_id, 
  case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1 
     then i.st_date 
  end as st_date, 
  case when row_number() over (partition by i.st_id, i.st_sl, u.util_date order by u.serial_no) = 1 
     then i.st_sl 
  end as st_sl, 
  i.income_amount, 
  u.util_date, 
  u.serial_no,
  u.util_amount
from income i 
left join util u on 
         i.st_id = u.st_id
     and i.st_date = u.st_date
     and i.st_sl = u.st_sl;

Итак, первые три столбца получают значения только для первых строк в группе std_id, st_sl, util_date.

См. скрипку для демонстрации.(также было бы неплохо, если бы вы в следующий раз задали вопрос тестовым данным.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...