Распространенные сводные данные - PullRequest
0 голосов
/ 08 марта 2019

У меня есть таблица со следующими данными

ID|LabelID|Value
1 |1      |3
1 |2      |1
1 |3      |15
2 |1      |5
2 |2      |7
2 |3      |5

Я хочу получить следующее как результат в обширной базе данных

ID|Label1|Label2|Label3
1 |3     |1     |15
2 |5     |7     |5

У кого-нибудь есть идея?Я попробовал кое-что, и лучший результат, который я могу получить, это:

ID|Label1|Label2|Label3
1 |3     |      |
1 |      |1     |
1 |      |      |15
2 |5     |      |
2 |      |7     |
2 |      |      |5

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Вот запрос, который работал для меня.

create table psqlPivot (id integer, labelid integer, val integer);
insert into psqlPivot values (1, 1,3);
insert into psqlPivot values (1, 2,1);
insert into psqlPivot values (1, 3,15);
insert into psqlPivot values (2, 1,5);
insert into psqlPivot values (2, 2,7);
insert into psqlPivot values (2, 3,5);

select distinct v.id, (select a.val as label1 from psqlPivot a where a.labelid = 1 and a.id = v.id)
,(select b.val as label2 from psqlPivot b where b.labelid = 2 and b.id = v.id)
,(select c.val as label3 from psqlPivot c where c.labelid = 3 and c.id = v.id)
from psqlpivot v
1 голос
/ 08 марта 2019

Веселись ... :-)

Должно работать в большинстве версий SQL. Существуют специфичные для поставщика операторы PIVOT, которые также являются опцией.

Это был способ сделать это до предложения PIVOT.

drop table #test;
create table #test (ID int, LabelID int, Value int);

insert into #test values (1, 1, 3)
,(1, 2, 1)
,(1, 3, 15)
,(2, 1, 5)
,(2, 2, 7)
,(2, 3, 5);

select ID
      ,sum(case when LabelID = 1 then Value else null end) as Label1
      ,sum(case when LabelID = 2 then Value else null end) as Label2
      ,sum(case when LabelID = 3 then Value else null end) as Label3
  from #test
group by ID;
...