sql >> Database >  >> RDS >> Mysql

SQL-query om een ​​tabel opnieuw op te bouwen met behulp van de dynamische rijgegevens voor kolomnamen

Dit is eigenlijk een PIVOT maar MySQL heeft geen PIVOT-functie. U wilt dit dus repliceren met een aggregatiefunctie en een CASE uitspraak. Als u het aantal Grant weet waarden die je hebt, dan kun je de query hardcoderen zoals deze:

select 
  Month,
  sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
  sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
  sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
  sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
  sum(case when `grant`='Other' then subtotal else 0 end) Other,
  sum(case when `grant`='State' then subtotal else 0 end) State
from yourtable
group by month

Zie SQL Fiddle met demo

Als u nu een onbekend aantal waarden heeft voor Grant , dan kunt u een voorbereide instructie gebruiken om een ​​dynamische versie van deze query te genereren:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when `Grant` = ''',
      `Grant`,
      ''' then Subtotal else 0 end) AS `',
      `Grant`, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT month, ', @sql, ' 
                  FROM yourtable 
                  group by month');


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

Zie SQL Fiddle met demo

Beide geven hetzelfde resultaat:

|    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
-----------------------------------------------------------------
| Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
| Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
| Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |



  1. Wat is de syntaxis om het gebruik van een index voor een join in MySQL te forceren?

  2. PHP Meerdere rijen verwijderen met selectievakje

  3. tijdstempelwaarden invoegen in stappen van 3 minuten

  4. groeperen op datum aggregatiefunctie in postgresql