Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie man Tabellen in MySQL schwenkt

Es gibt 3 Dinge, über die man nachdenken sollte 1) Wie man dynamisch einen Haufen von max generiert (Fall, wenn 2) etwas zuweist, um den Fall zu gruppieren, wenn es vorbei ist - in diesem Fall generiere ich eine Zeilennummer mit einer Variablen, die 3) einige Ihrer Berufsbezeichnungen enthält Leerzeichen, die ich für die Generierung von Spaltenüberschriften entferne

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
             )
;           

Generiert diesen SQL-Code

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;

Welches an dynamisches SQL übermittelt werden kann

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

Ergebnis

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