Объединить строки одного и того же значения столбца - PullRequest
1 голос
/ 12 марта 2020

У меня есть таблица, в которой есть данные, хранящиеся в такой таблице

ITEM        GROUP                           CHAR1           CHAR2      CHAR3

240-000199  2x_P3_CATALOG_VALUES_ATTGRP     PWA (SMT+TH)    M-R0027 
240-000199  2x_P3_CATALOG_VALUES_ATTGRP                                IBIZA REFRESH
240-000199  Inventory Org                   LH1     
240-000199  Inventory Org                   LS1     
240-000199  Inventory Org                                              CD1 ; LH1

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

ITEM        GROUP                           CHAR1           CHAR2      CHAR3

240-000199  2x_P3_CATALOG_VALUES_ATTGRP     PWA (SMT+TH)    M-R0027    IBIZA REFRESH
240-000199  Inventory Org                   LH1     
240-000199  Inventory Org                   LS1                        CD1 ; LH1

или не имеет значения, показывает ли он примерно так

ITEM        GROUP                           CHAR1           CHAR2      CHAR3

240-000199  2x_P3_CATALOG_VALUES_ATTGRP     PWA (SMT+TH)    M-R0027    IBIZA REFRESH
240-000199  Inventory Org                   LH1                        CD1 ; LH1
240-000199  Inventory Org                   LS1                        CD1 ; LH1

Мне нужно сгруппировать на основе группы и элемента и объединить строки с нулевыми значениями

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Я не уверен, будет ли это работать так же в oracle, но работает на SQL сервер

 Select Distinct T1.[Item], T1.[Group],T2.Char1,T3.char2,T4.Char3 
 from ItemsG T1 
 Left Outer Join 
 ItemsG T2 
 on T1.Item=T2.Item and T1.[Group]=T2.[Group] and T2.char1 is Not null
 Left Outer Join  
 ItemsG T3 on T1.Item=T3.Item and T1.[Group]=T3.[Group] and T3.char2 is not null
 Left Outer Join 
 ItemsG T4 on T1.Item=T4.Item and T1.[Group]=T4.[Group] and T4.char3 is not null
2 голосов
/ 12 марта 2020

Вот один из вариантов; разбить каждый CHARn столбец на собственный подзапрос , а затем выполнить внешнее объединение их всех.

Пример данных:

SQL> select * from test;

ITEM       CGROUP                      CHAR1        CHAR2   CHAR3
---------- --------------------------- ------------ ------- -------------
240-000199 2x_P3_CATALOG_VALUES_ATTGRP PWA (SMT+TH) M-R0027
240-000199 2x_P3_CATALOG_VALUES_ATTGRP                      IBIZA REFRESH
240-000199 Inventory Org               LH1
240-000199 Inventory Org               LS1
240-000199 Inventory Org                                    CD1 ; LH1

Запрос:

SQL> with
  2  c1 as
  3    (select distinct item, cgroup, char1
  4     from test
  5     where char1 is not null
  6    ),
  7  c2 as
  8    (select distinct item, cgroup, char2
  9     from test
 10     where char2 is not null
 11    ),
 12  c3 as
 13    (select distinct item, cgroup, char3
 14     from test
 15     where char3 is not null
 16    )
 17  select c1.item, c1.cgroup, c1.char1, c2.char2, c3.char3
 18  from c1 left join c2 on c1.item = c2.item and c1.cgroup = c2.cgroup
 19          left join c3 on c1.item = c3.item and c1.cgroup = c3.cgroup;

ITEM       CGROUP                      CHAR1        CHAR2   CHAR3
---------- --------------------------- ------------ ------- -------------
240-000199 2x_P3_CATALOG_VALUES_ATTGRP PWA (SMT+TH) M-R0027 IBIZA REFRESH
240-000199 Inventory Org               LS1                  CD1 ; LH1
240-000199 Inventory Org               LH1                  CD1 ; LH1

SQL>
0 голосов
/ 12 марта 2020

Я бы использовал row_number() и агрегацию. Вот один метод, использующий union all:

select item, group, max(char1), max(char2), max(char3)
from ((select item, group, char1, null as char2, null as char3
              row_number() over (partition by item, group order by char1) as seqnum
       from t
       where char1 is not null
      ) union all
      (select item, group, char1, char2, null as char3
              row_number() over (partition by item, group order by char2) as seqnum
       from t
       where char2 is not null
      ) union all
      (select item, group, null as char1, null as char2, char3
              row_number() over (partition by item, group order by char3) as seqnum
       from t
       where char3 is not null
      ) 
     ) t
group by item, group, seqnum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...