SQL Просмотр Выбрать Необязательно - PullRequest
0 голосов
/ 28 марта 2020

У меня есть вид, что текущий вывод примерно такой

   Code Value GrpCode GrpDft
  --------------------------
   A,   1,    A1,     N
   B,   null, A1,     Y
   C,   1,    A2,     N
   D,   2,    A2,     Y
   E,   null, A3,     Y
   F,   null, A3,     N       

Правила следующие:

  1. Каждая группа может иметь только 2 кода и всегда иметь код по умолчанию vs не код по умолчанию.
  2. ЕСЛИ код по умолчанию не равен нулю, то всегда показывать строку. Независимо от того, имеет ли значение код не по умолчанию или нет
  3. Если код по умолчанию равен нулю, то отображать значение кода не по умолчанию, только если оно имеет значение.
  4. Если и код по умолчанию, и код не по умолчанию являются нулевыми, то показать значение по умолчанию.

Таким образом, исходя из вышеизложенного, у меня должна быть оставшаяся строка ниже.

   A, 1,    A1, N
   D, 2,    A2, Y
   E, null, A3, Y

К сожалению, из-за других факторов это должно быть сделано как представление, а не как хранимая процедура или функции.

1 Ответ

1 голос
/ 28 марта 2020

Если я следил за вами правильно, вы можете реализовать эту логику c с оконными функциями:

select * 
from (
    select 
        t.*,
        row_number() over(
            partition by grpCode
            order by 
                case
                    when grpDft = 'Y' and value is not null then 0
                    when grpDft = 'N' and value is not null then 1
                    else 2
                end,
                grpDft desc
        ) rn
    from mytable t
) t
where rn = 1

Демонстрация на DB Fiddle :

Code | Value | GrpCode | GrpDft | rn
:--- | ----: | :------ | :----- | :-
A    |     1 | A1      | N      | 1 
D    |     2 | A2      | Y      | 1 
E    |  <em>null</em> | A3      | Y      | 1 
...