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

MySQL - Vytvořte jeden záznam ze sloupce

To, co požadujete, je v podstatě PIVOT ale MySQL nemá funkci pivot, takže ji můžete replikovat pomocí CASE příkaz s agregační funkcí.

Pokud znáte hodnoty, můžete natvrdo zakódovat řešení podobné tomuto:

select id,
  max(case when component_id = 1 then data end) Email,
  max(case when component_id = 2 then data end) Firstname,
  max(case when component_id = 3 then data end) Lastname,
  max(case when component_id = 4 then data end) Phone
from yourtable
group by id;

Viz SQL Fiddle s ukázkou

Výsledek je:

| ID |            EMAIL |  FIRSTNAME |  LASTNAME |  PHONE |
-----------------------------------------------------------
|  1 | [email protected] | firstname1 | lastname1 | phone1 |
|  2 |           email2 | firstname2 | lastname2 | phone2 |

Hádám, že máte tabulku pro přiřazení component_id k názvu, takže váš dotaz může být také:

select t1.id,
  max(case when t2.name = 'email' then data end) Email,
  max(case when t2.name= 'FirstName' then data end) Firstname,
  max(case when t2.name= 'LastName' then data end) Lastname,
  max(case when t2.name= 'phone' then data end) Phone
from yourtable t1
inner join component t2
  on t1.component_id = t2.id 
group by t1.id;

Viz SQL Fiddle s ukázkou

Pokud máte neznámý počet hodnot, můžete použít připravený příkaz k dynamickému generování tohoto dotazu:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when name = ''',
      name,
      ''' then data end) AS ',
      name
    )
  ) INTO @sql
FROM component;

SET @sql = CONCAT('SELECT t1.id, ', @sql, ' 
                  from yourtable t1
                  inner join component t2
                    on t1.component_id = t2.id 
                  group by t1.id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Viz SQL Fiddle s ukázkou

Všechny verze vám poskytnou stejný výsledek.




  1. Jak zakázat všechny spouštěče v databázi SQL Server

  2. Nezanedbatelný rozdíl v prováděcím plánu oproti Oracle při použití jdbc Timestamp nebo Date

  3. Salesforce SOQL od Crystal Reports

  4. Jak vyprázdním vyrovnávací paměť PRINT v TSQL?