Таблица SQL PIVOT с MIN () и несколькими столбцами - PullRequest
0 голосов
/ 15 ноября 2018

Вот структура таблицы

ID          TypeX   TypeXDesc           XDate       TypeCodeY
040001      3669    Unspecified Cat    2005-08-08   1
040001      3669    Unspecified Cat    2006-08-29   2
040001      37515   Tear Film          2005-08-08   1
040001      37999   Disor              2004-07-22   1

Преобразование над таблицей INTO ниже USING PIVOT

ID          TypeX_1 TypeXDesc_1         XDate_1     TypeCodeY_1     TypeX_2 TypeXDesc_2         XDate_2     TypeCodeY_2     TypeX_3 TypeXDesc_3 XDate_3     TypeCodeY_3
040001      3669    Unspecified Cat    2005-08-08   1               37515   Tear Film          2005-08-08   1               37999   Disor       2004-07-22  1

Посмотрите на тот же код TypeX, но XDate отличается, и нам нужно получить Min (XDate), чтобы первая строка квалифицировалась, а не вторая.

1 Ответ

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

Вы можете сделать это с помощью условного агрегирования. В этом случае вы можете перечислить строки в пределах групп typex / id, используя row_number(). Вы можете перечислить группы с помощью typex / id, используя dense_rank().

Затем используйте условное агрегирование:

select t.id,
       max(case when grpnum = 1 and seqnum = 1 then typex end) as typex_1,
       max(case when grpnum = 1 and seqnum = 1 then TypeXDesc end) as TypeXDesc_1,
       max(case when grpnum = 1 and seqnum = 1 then XDate end) as XDate_1,
       max(case when grpnum = 1 and seqnum = 1 then TypeCodeY end) as TypeCodeY_1,
       max(case when grpnum = 2 and seqnum = 1 then typex end) as typex_12,
       max(case when grpnum = 2 and seqnum = 1 then TypeXDesc end) as TypeXDesc_2,
       max(case when grpnum = 2 and seqnum = 1 then XDate end) as XDate_2,
       max(case when grpnum = 2 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3,
       max(case when grpnum = 3 and seqnum = 1 then typex end) as typex_1,
       max(case when grpnum = 3 and seqnum = 1 then TypeXDesc end) as TypeXDesc_3,
       max(case when grpnum = 3 and seqnum = 1 then XDate end) as XDate_3,
       max(case when grpnum = 3 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3
from (select t.*,
             row_number() over (partition by id, typex order by xdate as seqnum,
             dense_rank() over (partition by id order by typex) as grpnum
     from t
    ) t
group by id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...