Сводить строки в столбцы с идентификатором не повторяется - PullRequest
2 голосов
/ 23 апреля 2019

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

Rownumber ID     Type             Category Value
1         100   1-Purchase Order  Address  Cedar Rd
2                                 City     Beachwood
3                                 State    Ohio
4                                 Zip      44122
5         300   1-Purchase Order  Address  Rockside Rd
6                                 City     Independence
7                                 State    Ohio
8                                 Zip      44131
9         200   1-Purchase Order  Address  Rockside Rd
10                                City     Independence
11                                State    Ohio
12                                Zip      44131  

Требуемый вывод:

Rownumber  ID   Type              Address      City        State  Zip
1         100  1-Purchase Order  Cedar Rd      Beachwood   Ohio   44122
2         300   1-Purchase Order Rockside Rd  Independence Ohio   44122
3         200   1-Purchase Order Rockside Rd  Independence Ohio   44122

Обратите внимание, что идентификатор отображается в случайном порядке, из-за которого этот код не работал:

    select row_number() over (order by min(id)) as rownumber,
           new_id as id,
           max(type) as type,
           max(case when category = 'Address' then value end) as address,
           max(case when category = 'City' then value end) as city,
           max(case when category = 'State' then value end) as state,
           max(case when category = 'Zip' then value end) as zip
    from (select t.*,
                 coalesce(id, max(id) over (order by rownumber)) as new_id
          from t
         ) t
    group by new_id;

1 Ответ

4 голосов
/ 23 апреля 2019

Вы можете легко исправить этот код, потому что вам действительно не нужны идентификаторы. Вам просто нужен способ определить группы. Таким образом, совокупный счет должен делать то же самое:

select row_number() over (order by min(rownumber)) as rownumber,
       max(id) as id,
       max(type) as type,
       max(case when category = 'Address' then value end) as address,
       max(case when category = 'City' then value end) as city,
       max(case when category = 'State' then value end) as state,
       max(case when category = 'Zip' then value end) as zip
from (select t.*,
             count(id) over (order by rownumber) as grp
      from t
     ) t
group by grp;

Это присваивает все NULL значения непосредственно предшествующей ненулевой id группировке.

Здесь - это дБ <> скрипка.

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