Transponeren van kolom naar rij (MySQL)
Naar navigatie springen
Naar zoeken springen
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Het probleem
Ik heb een lege tabel met zo'n 60 velden:
+--------+--------+--------+--------+ | Veld01 | Veld02 | ... | Veld20 | +--------+--------+--------+--------+
Ik wil de namen van die velden in het eerste record zetten, zodat je zoiets krijgt als
+--------+--------+--------+--------+ | Veld01 | Veld02 | ... | Veld20 | +--------+--------+--------+--------+ | Veld01 | Veld02 | ... | Veld20 | +--------+--------+--------+--------+
Achterhalen van de veldnamen is niet moeilijk. Bv.: create table tmp select column_name from information_schema.columns where table_name="tabelnaam";
.
Maar hoe krijg ik die namen nu op één rij?
Mogelijke oplossingen
- Grouping ligt voor de hand als oplossing, maar daabij wordt één variable gegenereerd met daarin meerdere veldnamen. Alles wordt dus in één veld gestopt
- Grouping + Explode: Nu worden de cellen gesplitst, maar belanden ze weer op verschillende rijen
- Pivoting of unpivoting zoals in een pivot table is misschien een oplossing, maar ik wil eigenlijk niets doen met aggregeren van info
- Union select: Deze vernuftige oplossing gebruikt UNION SELECT-statements om data samen te voegen maarrrr daarmee belandt data nog steeds in verschillende rijen
- Prepared insert-statement: Dit gaat zeker lukken: Ik heb de velden immers al in een string. Hoef ik nog maar om te fietsen naar een prepared statement + uitvoeren.
Oplossing: Prepared Insert-statement
Algemene formulering:
insert into tbl_tabel values (waarde1, waarde2, ...);
Oplossing:
CREATE DEFINER=`root`@`localhost` PROCEDURE `VeldnamenEN`() BEGIN -- -- Kopiëer de kolomnamen naar de tweede regel van de tabel -- set @ddl=concat ( "insert into amazon_sjabloon values('" , ( select group_concat(column_name separator "', '") from information_schema.columns where table_name="sjabloon" and TABLE_SCHEMA="webwinkels" ) , "');" ); -- select @ddl; prepare stmt from @ddl; execute stmt;