Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie SQL do odbudowania tabeli przy użyciu dynamicznych danych wierszy dla nazw kolumn

To jest w zasadzie PIVOT ale MySQL nie ma funkcji PIVOT. Więc będziesz chciał powtórzyć to za pomocą funkcji agregującej i CASE oświadczenie. Jeśli znasz liczbę Grant wartości, które posiadasz, możesz zakodować zapytanie w podobny sposób:

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

Zobacz Skrzypce SQL z wersją demonstracyjną

Teraz, jeśli masz nieznaną liczbę wartości dla Grant , możesz użyć przygotowanej instrukcji do wygenerowania dynamicznej wersji tego zapytania:

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;

Zobacz SQL Fiddle z wersją demonstracyjną

Oba dają ten sam wynik:

|    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie procedury MYSQL w migracjach Laravel 4

  2. PHP zapisuje 800 rekordów do pliku (.txt) z bazy danych

  3. Wykonywanie porównania LIKE na polu INT

  4. MySQL:Rozmiar dziesiętnego typu danych

  5. dostępność pokoi w hotelu mysql