sql >> Databáze >  >> RDS >> Mysql

Jak kontingenční tabulky v MySQL

Je třeba myslet na 3 věci 1) Jak dynamicky generovat spoustu max (případ, když 2) přiřadit něco k seskupení případu, když je podle - v tomto případě generuji číslo řádku pomocí proměnné 3) některé z vašich pracovních pozic obsahují bílé místo, které odstraním pro generování záhlaví sloupců

set @sql = 
            (select concat('select ', gc,            ' from 
             (select name,job_title,
                if (job_title <> @p, @rn:=1 ,@rn:[email protected]+1) rn,
                @p:=job_title p
                from t
                cross join (select @rn:=0,@p:=null) r
                order by job_title
              ) s group by rn;') from
            (select 
                group_concat('max(case when job_title = ', char(39),job_title ,char(39),' then name else char(32) end ) as ',replace(job_title,char(32),'')) gc
                from
                (
                select distinct job_title from t
                ) s
                ) t
             )
;           

Vygeneruje tento sql kód

select max(case when job_title = 'Fireman' then name else char(32) end ) as Fireman,
        max(case when job_title = 'Driver' then name else char(32) end ) as Driver,
        max(case when job_title = 'Analyst' then name else char(32) end ) as Analyst,
        max(case when job_title = 'Postman' then name else char(32) end ) as Postman,
        max(case when job_title = 'Research Manager' then name else char(32) end ) as ResearchManager
         from 
             (select name,job_title,
                if (job_title <> @p, @rn:=1 ,@rn:[email protected]+1) rn,
                @p:=job_title p
                from t
                cross join (select @rn:=0,@p:=null) r
                order by job_title
              ) s group by rn;

Které lze odeslat do dynamického sql

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;

výsledek

+---------+--------+---------+---------+-----------------+
| Fireman | Driver | Analyst | Postman | ResearchManager |
+---------+--------+---------+---------+-----------------+
| Sam     | Tomas  | Lisa    | Marcus  | Mary            |
| Peter   | Chen   | Stephan |         |                 |
|         |        | Albert  |         |                 |
+---------+--------+---------+---------+-----------------+
3 rows in set (0.00 sec)


  1. Analýza názvů tabulek a sloupců z SQL/HQL Java

  2. Procesory AMD EPYC ve virtuálních počítačích Azure

  3. Odstraňte řádky ze serveru mysql ze seznamu ID C#

  4. GROUP_CONCAT s limitem