sql >> Database teknologi >  >> RDS >> Mysql

Opret en oversigtsvisning i MySQL ved at dreje række til dynamisk antal kolonner

Du skal pivotere tabellen, men mysql har ikke sådan en pivotfunktion

så vi er nødt til at replikere dens funktionalitet

REDIGERET

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

Der er 2 tilgange til at løse dit problem1. oprette sag for hvert år, hvilket ikke er muligt i dit tilfælde, da vi har at gøre med år2. generer forespørgslen dynamisk, så vi får de rigtige kolonner efter dit behov.

Jeg har givet løsning i henhold til den anden løsning, hvor jeg genererer forespørgslen og gemmer den i @sql variabel. I violinen har jeg printet indholdet af @sql før den udføres.

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; 
 

For mere information om group_concat() gå gennem linketGROUP_CONCAT ogBRUGERDEFINERET VARIABEL

Håber dette hjælper..



  1. Opret Trigger for at slette rækker, der er>90 dage gamle

  2. SYSDATE() Eksempler – MySQL

  3. tjek om kolonnen findes før ALTER TABLE -- mysql

  4. Opdater SQL Server-statistikker ved hjælp af en databasevedligeholdelsesplan