sql >> Database teknologi >  >> RDS >> Mysql

Dynamisk forespørgsel i MySQL

For at få det resultat, du ønsker, skal du både afpivot de aktuelle data fra kolonner til rækker, og drej derefter year data fra rækker til kolonner.

MySQL har ikke en PIVOT- eller UNPIVOT-funktion, så du skal bruge en UNION ALL forespørgsel til unpivot og en aggregeret funktion med en CASE udtryk til at dreje.

Hvis du har et kendt antal værdier, kan du hårdkode værdier svarende til dette:

select locid,
  event,
  max(case when year = 2011 then value end) `2011`,
  max(case when year = 2012 then value end) `2012`
from
(
  select LocId, Year, 'Birth' event, Birth value
  from yt
  union all
  select LocId, Year, 'Death' event, Death value
  from yt
  union all
  select LocId, Year, 'Abc' event, Abc value
  from yt
) d
group by locid, event;
 

Se SQL Fiddle with Demo .

Men hvis du skal have et ukendt antal værdier, så skal du bruge en forberedt sætning til at generere dynamisk SQL. Koden vil ligne følgende:

SET @sql = NULL;
SET @sqlUnpiv = NULL;
SET @sqlPiv = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select locid, year, ''',
      c.column_name,
      ''' as event, ',
      c.column_name,
      ' as value 
      from yt '
    ) SEPARATOR ' UNION ALL '
  ) INTO @sqlUnpiv
FROM information_schema.columns c
where c.table_name = 'yt'
  and c.column_name not in ('LocId', 'Year')
order by c.ordinal_position;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN year = ',
      year,
      ' THEN value else null END) AS `',
      year, '`'
    )
  ) INTO @sqlPiv
FROM yt;

SET @sql 
  = CONCAT('SELECT locid,
              event, ', @sqlPiv, ' 
            from 
            ( ',  @sqlUnpiv, ' ) d
            group by locid, event');

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

Se SQL Fiddle with Demo . Resultatet for begge forespørgsler er:

| LOCID | EVENT | 2011 | 2012 | ------------------------------- | 1 | Abc | 10 | 20 | | 1 | Birth | 100 | 98 | | 1 | Death | 60 | 70 |


  1. Brug af COALESCE-funktionen til at lave værdier adskilt med kommaer

  2. Galera Cluster Recovery 101 - Et dybt dyk ind i netværkspartitionering

  3. mysql.h filen kan ikke findes

  4. Konverter SQLITE SQL dump-fil til POSTGRESQL