sql >> Database >  >> RDS >> Mysql

Maak een overzichtsweergave in MySQL door de rij te draaien in een dynamisch aantal kolommen

U moet de tabel draaien, maar mysql heeft niet zo'n functie van pivot

dus we moeten de functionaliteit repliceren

BEWERKT

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;

Resultaat

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

SQL FIDDLE

Er zijn 2 benaderingen om uw probleem op te lossen1. maak een casus voor elk jaar, wat in uw geval niet mogelijk is omdat we met jaar 2 te maken hebben. genereer de query dynamisch zodat we de juiste kolommen krijgen volgens uw behoefte.

Ik heb een oplossing gegeven volgens de tweede oplossing waar ik de query aan het genereren ben en opslaat in @sql variabel. In de viool heb ik de inhoud van @sql . afgedrukt voordat u het uitvoert.

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; 

Voor meer informatie over group_concat() ga door de linkGROUP_CONCAT endoor de gebruiker gedefinieerde variabele

Ik hoop dat dit helpt..



  1. Mysql group_concat met sommen ook binnen

  2. Wordt het TransactionScope-object volledig ondersteund met MySqlConnector voor .NET?

  3. Vreemd dubbel gedrag van GROUP_CONCAT van twee LEFT JOIN's van GROUP_BY's

  4. Hoe QUARTER() werkt in MariaDB