Musisz obrócić tabelę, ale mysql nie ma takiej funkcji obrotu
więc musimy powtórzyć jego funkcjonalność
EDYTOWANO
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;
Wynik
| COMPANY_NAME | 2008 | 2009 | 2010 | NULL |
--------------------------------------------
| companyA | 1 | 0 | 0 | 0 |
| companyB | 0 | 2 | 0 | 0 |
| companyC | 0 | 0 | 3 | 3 |
SQL FIDDLE
Istnieją 2 podejścia do rozwiązania Twojego problemu1. twórz sprawę na każdy rok, co nie jest możliwe w Twoim przypadku, ponieważ mamy do czynienia z year2. generuj zapytanie dynamicznie, dzięki czemu otrzymamy odpowiednie kolumny zgodnie z Twoimi potrzebami.
Podałem rozwiązanie zgodnie z drugim rozwiązaniem, w którym generuję zapytanie i przechowuję je w @sql
zmienny. Na skrzypcach wydrukowałem zawartość @sql
przed wykonaniem.
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;
Więcej informacji na temat group_concat()
przejdź przez linkGROUP_CONCAT
orazZMIENNA ZDEFINIOWANA PRZEZ UŻYTKOWNIKA
Mam nadzieję, że to pomoże...