Dynami c Pivot для набора результатов - PullRequest
0 голосов
/ 06 марта 2020

Я ищу эффективный способ создать следующий набор результатов. У кого-то есть идея, как я мог начать. Я понятия не имею, чтобы начать. Читая что-нибудь о Pivot, но не знаю. Проблема в том, что строки в таблице не ограничены, это означает, что я не знаю, сколько столбцов должно быть показано.

Table1
--------------
|ID1  | Name1| 
--------------
| 1   | Name1|
| 2   | Name2|
| 3   | Name3|

Table 2
--------------------
|ID2  | Name2| Use |
--------------------
| 1   | xyz1 |True |
| 2   | xyz2 |False|
| 3   | xyz3 |True |
| 4   | xyz4 |True |
Table3
--------------------
|ID_3|FK_ID1 |FK_ID2|
| 1  | 1     | 1    |
| 3  | 3     | 1    |
| 4  | 1     | 3    |
| 5  | 2     | 3    |

Resultset
---------------------------------
ID1 | Name1 | xyz1| xyz3 | xyz4 |
-------------------------- 
1   | Name1 | True|True  | False|
2   | Name2 |False| True | False|
3   | Name3 | True|False | False|

Ответы [ 2 ]

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

Чтобы развернуть список столбцов fixed , вы можете выполнить условное агрегирование:

select 
    t1.id1,
    t1.name1,
    max(case when t2.name2 = 'xyz1' then t2.use else 'False' end) xyz1,
    max(case when t2.name2 = 'xyz3' then t2.use else 'False' end) xyz3,
    max(case when t2.name2 = 'xyz4' then t2.use else 'False' end) xyz4
from table1 t1
inner join table3 t3 on t3.fk_id1 = t1.id1
inner join table2 t2 on t2.id2 = t3.fk_id2
where t2.name2 in ('xyz1', 'xyz3', 'xyz4')
group by t1.id1, t1.name1
1 голос
/ 06 марта 2020

Это выглядит как join и агрегация:

select t1.id, t1.name,
       max(case when t2.name2 = 'xyz1' then t2.use else 'false' end) as xyz1,
       max(case when t2.name2 = 'xyz2' then t2.use else 'false' end) as xyz2,
       max(case when t2.name2 = 'xyz3' then t2.use else 'false' end) as xyz3
from table3 t3 join
     table1 t1 
     on t3.fk_id1 = t1.id join
     table2 t2
     on t3.fk_id2 = t2.id
group by t1.id, t1.name;
...