sql >> Databáze >  >> RDS >> Mysql

mysql vybrat dynamické hodnoty řádků jako názvy sloupců, jiný sloupec jako hodnotu

Na rozdíl od některých jiných RDBMS MySQL nemá nativní podporu pro pivotní operace tohoto druhu by design (vývojáři se domnívají, že je vhodnější pro prezentační, spíše než databázovou vrstvu vaší aplikace).

Pokud bezpodmínečně musíte provádět takové manipulace v rámci MySQL, je cesta k vytvoření připraveného příkazu – i když spíše než si pohrávat s CASE , pravděpodobně bych použil pouze MySQL GROUP_CONCAT() funkce:

SELECT CONCAT(
  'SELECT `table`.id', GROUP_CONCAT('
     ,    `t_', REPLACE(name, '`', '``'), '`.value
         AS `', REPLACE(name, '`', '``'), '`'
     SEPARATOR ''),
 ' FROM `table` ', GROUP_CONCAT('
     LEFT JOIN `table`   AS `t_', REPLACE(name, '`', '``'), '`
            ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
           AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
     SEPARATOR ''),
 ' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;

PREPARE stmt FROM @qry;
EXECUTE stmt;

Podívejte se na sqlfiddle .

Všimněte si, že výsledek GROUP_CONCAT() je omezena group_concat_max_len proměnná (výchozí 1024 bajtů:zde pravděpodobně nebude relevantní, pokud nemáte nějaké extrémně dlouhé name hodnoty).




  1. Dynamické spouštění SQL na serveru SQL

  2. zobrazení obrázku uloženého v mysql blob

  3. Alternativy PGTune - Konfigurace ClusterControl PostgreSQL

  4. Autentizační plugin 'caching_sha2_password' není podporován