sql >> Databasteknik >  >> RDS >> Mysql

Skapa en sammanfattningsvy i MySQL genom att svänga raden till ett dynamiskt antal kolumner

Du måste pivotera tabellen men mysql har inte någon sådan pivotfunktion

så vi måste replikera dess funktionalitet

REDIGERAD

Select 
  group_concat(
    DISTINCT 
       if(year is null,
          CONCAT('max(if (year is null, state, 0)) as ''NULL'' '),
          CONCAT('max(if (year=''', year, ''', state, 0)) as ''',year, ''' '))
    ) into @sql from tbl join (SELECT @sql:='')a;
set @sql = concat('select company_name, ', @sql, 'from tbl group by company_name;');
PREPARE stmt FROM @sql;
EXECUTE stmt;

Resultat

| COMPANY_NAME | 2008 | 2009 | 2010 | NULL |
--------------------------------------------
|     companyA |    1 |    0 |    0 |    0 |
|     companyB |    0 |    2 |    0 |    0 |
|     companyC |    0 |    0 |    3 |    3 |

SQL-FIDDLE

Det finns två sätt att lösa ditt problem1. skapa case för varje år, vilket inte är möjligt i ditt fall då vi har att göra med år2. generera frågan dynamiskt så att vi får rätt kolumner enligt ditt behov.

Jag har gett lösningen enligt den andra lösningen där jag genererar frågan och lagrar den i @sql variabel. I fiolen har jag skrivit ut innehållet i @sql innan du kör det.

select company_name, max(if (year='2008', state, 0)) as '2008' ,max(if (year='2009', state, 0)) as '2009' ,max(if (year='2010', state, 0)) as '2010' ,max(if (year is null, state, 0)) as 'NULL' from tbl group by company_name; 

För mer information om group_concat() gå igenom länkenGROUP_CONCAT ochANVÄNDARDEFINIERAD VARIABEL

Hoppas detta hjälper...



  1. Aktiverar tvåfaktorsautentisering för ScaleGrid DBaaS

  2. får fel - SQLSTATE[21000]:Kardinalitetsbrott:1241 Operand bör innehålla 1 kolumn(er)

  3. Mätning av faktisk MySQL-frågetid

  4. Hur man beräknar skillnaden mellan två datumtider i T-SQL