Je veux faire quelque chose comme ça
SELECT ID, X, Y, Z FROM TABLE_1
cela me renvoie quelque chose comme:
| IDTABLE_1 | X | Y | Z | | 1 | a | b | c | | 2 | d | e | f | | 3 | g | h | i |
Et j'ai une autre table TABLE_2 qui a une colonne avec les noms de colonnes de la table précédente (TABLE_1):
| IDTABLE_2 | COLUMN | | 101 | X | | 102 | Y | | 103 | Z |
et maintenant je dois insert toutes mes données de la sélection dans cette nouvelle table TABLE_3 et cela doit être comme ceci:
| IDTABLE_3 | IDTABLE_1 | IDTABLE_2 | VALUE | | 201 | 1 | 101 | a | | 202 | 1 | 102 | b | | 203 | 1 | 103 | c | | 204 | 2 | 101 | d | | 205 | 2 | 102 | e | | 206 | 2 | 103 | f | | 207 | 3 | 101 | g | | 208 | 3 | 102 | h | | 209 | 3 | 103 | i |
Toute suggestion sur un moyen simple de le faire?
SELECT IDENTITY(int, 200, 1) IDTABLE_3, T1.IDTABLE_1, T2.IDTABLE_2, CASE T2.COLUMN WHEN 'X' THEN T1.X WHEN 'Y' THEN T1.Y WHEN 'Z' THEN T1.Z END VALUE INTO TABLE_3 FROM TABLE_1 T1 CROSS JOIN TABLE_2 T2
Vous pouvez utiliser l'opérateur de table UNPIVOT
pour ce faire, comme ceci:
WITH CTE AS ( SELECT IDTABLE_1, ID, value FROM Table_1 UNPIVOT ( ID FOR value IN(x, y,z) ) u ) SELECT ROW_NUMBER() OVER(ORDER BY t1.ID) + 200 AS IDTABLE_3 , t1.IDTABLE_1, t2.[IDTABLE_2], t1.ID AS VALUE FROM CTE t1 INNER JOIN TABLE_2 t2 ON t1.value = t2."Column";
Cela vous donnera:
| IDTABLE_3 | IDTABLE_1 | IDTABLE_2 | VALUE | --------------------------------------------- | 201 | 1 | 101 | a | | 202 | 1 | 102 | b | | 203 | 1 | 103 | c | | 204 | 2 | 101 | d | | 205 | 2 | 102 | e | | 206 | 2 | 103 | f | | 207 | 3 | 101 | g | | 208 | 3 | 102 | h | | 209 | 3 | 103 | i |
Selon votre version de SQL Server, vous pouvez utiliser la fonction UNPIVOT
sur la première table, appliquer un row_number()
à chaque table, puis vous row_number()
sur le numéro de ligne. La fonction UNPIVOT
prend les colonnes X
, Y
et Z
et les convertit en lignes. Une fois cette conversion effectuée, vous atsortingbuez à chaque logging un row_number()
partitionné par IDTABLE_1
.
select row_number() over(order by t1.IDTABLE_1) + 200 AS IDTABLE_3, t1.IDTABLE_1, t2.IDTABLE_2, t1.value from ( select IDTABLE_1, value, col, row_number() over(partition by IDTABLE_1 order by col) rn from table1 unpivot ( value for col in (X, Y, Z) ) unpiv ) t1 inner join ( select IDTABLE_2, [COLUMN], row_number() over(order by IDTABLE_2) rn from Table2 ) t2 on t1.rn = t2.rn order by t1.IDTABLE_1;
Voir SQL Fiddle avec démo
Le résultat est:
| IDTABLE_3 | IDTABLE_1 | IDTABLE_2 | VALUE | --------------------------------------------- | 201 | 1 | 101 | a | | 202 | 1 | 102 | b | | 203 | 1 | 103 | c | | 204 | 2 | 101 | d | | 205 | 2 | 102 | e | | 206 | 2 | 103 | f | | 207 | 3 | 101 | g | | 208 | 3 | 102 | h | | 209 | 3 | 103 | i |