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

SQL dotaz k opětovnému sestavení tabulky pomocí dynamických dat řádků pro názvy sloupců

Toto je v podstatě PIVOT ale MySQL nemá funkci PIVOT. Takže to budete chtít replikovat pomocí agregační funkce a CASE tvrzení. Pokud znáte číslo Grant hodnoty, které máte, pak můžete napevno zakódovat dotaz podobný tomuto:

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

Viz SQL Fiddle s ukázkou

Nyní, pokud máte neznámý počet hodnot pro Grant , pak můžete pomocí připraveného příkazu vygenerovat dynamickou verzi tohoto dotazu:

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;

Viz SQL Fiddle s ukázkou

Oba poskytují stejný výsledek:

|    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. Jak mohu spustit dotaz v MYSQL, aniž bych jej zapsal do binárního protokolu

  2. Doporučené postupy mysqldump:Část 2 – Průvodce migrací

  3. SQL dotaz pro získání všech produktů, kategorií a metadat woocommerce/wordpress

  4. Filtrujte sestavu Power BI podle aktuálního uživatele