Je pense que la meilleure façon de le faire est à la fois en appliquant la UNPIVOT
et la fonction PIVOT
pour obtenir le résultat:
select account, description,
[value_1], [value_2], [value_3], [value_4]
from
(
select account, description, col, value,
row_number() over(partition by account, col order by col) rn
from
(
select [account], [description], [value_1], [value_2], [value_3], [value_4]
from yourtable
) src
unpivot
(
value
for col in ([value_1], [value_2], [value_3], [value_4])
) un
) s
pivot
(
max(value)
for col in ([value_1], [value_2], [value_3], [value_4])
) piv
Voir SQL Fiddle with Demo.
Cela peut aussi être fait en utilisant un UNION ALL
comme UNPIVOT et une fonction d'agrégation et une expression CASE
:
select account, description,
max(case when col = 'value_1' then value end) value_1,
max(case when col = 'value_2' then value end) value_2,
max(case when col = 'value_3' then value end) value_3,
max(case when col = 'value_4' then value end) value_4
from
(
select account, description, col, value,
row_number() over(partition by account, col order by account) rn
from
(
select [account], [description], 'value_1' col, [value_1] value
from yourtable
where [value_1] is not null
union all
select [account], [description], 'value_2' col, [value_2] value
from yourtable
where [value_2] is not null
union all
select [account], [description], 'value_3' col, [value_3] value
from yourtable
where [value_3] is not null
union all
select [account], [description], 'value_4' col, [value_4] value
from yourtable
where [value_4] is not null
) s
) un
group by account, description, rn
Voir SQL Fiddle with Demo
Les deux donnent le résultat:
| ACCOUNT | DESCRIPTION | VALUE_1 | VALUE_2 | VALUE_3 | VALUE_4 |
----------------------------------------------------------------------
| A00005 | Account Desc | ABCD0081 | BCDE0010 | BKCP0010 | SMTP0010 |
| A00005 | Account Desc | ABCD0082 | (null) | BKCP0011 | (null) |
Qu'est-ce qui vous fait mettre BCDE0010 dans la première rangée par rapport à la seconde? –
Quelle base de données - SQL Server, MySQL, Oracle? – sgeddes
L'opération que vous tentez s'appelle un Pivot. Essayez une recherche google sur "tableau croisé dynamique" – DwB