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...