Mysql 将SQL表展平为单个CSV友好表

Mysql 将SQL表展平为单个CSV友好表,mysql,sql,csv,pivot,Mysql,Sql,Csv,Pivot,由于某些原因,我正在接管一个需要以aCSV友好格式显示的数据库 目前有三个表。具有对象基本描述的对象,例如: id | date | name 1 | 2008-10-10 | Maestro 2 | 2008-10-12 | Domo 然后我有另一个包含事件类型和描述的表: ev_id | desc | desc2 1 | Event1 | "Something less good happened" 2 | Event2 | "Something goo

由于某些原因,我正在接管一个需要以aCSV友好格式显示的数据库

目前有三个表。具有对象基本描述的对象,例如:

id | date       | name
1  | 2008-10-10 | Maestro
2  | 2008-10-12 | Domo
然后我有另一个包含事件类型和描述的表:

ev_id | desc   | desc2
1     | Event1 | "Something less good happened"
2     | Event2 | "Something good happened"
最后,第三个表在这两个表之间建立连接:

id | ev_id
1  | 2
2  | 1
我需要的是将这三者结合起来,以便事件表中的每一行在最终视图中生成一列以及原始对象描述。如果发生事件,则应在相应的单元格中插入1,否则为0或NULL。例如:

id | date       | name    | Event1 | Event2
1  | 2008-10-10 | Maestro | 0      | 1
2  | 2008-10-12 | Domo    | 1      | 0
使用SQL MySQL是否可以实现这一点

SELECT A.*,
       (CASE WHEN B.ev_id = 1 THEN 1 ELSE 0 END) EVENT_1,
       (CASE WHEN B.ev_id = 2 THEN 1 ELSE 0 END) EVENT_2,
       .........
       .........
       (CASE WHEN B.ev_id = N THEN 1 ELSE 0 END) EVENT_N,
FROM   table1 A JOIN table2 B
ON     A.id = B.id
在mysql中实现这一点的唯一方法是动态构造查询,方法是循环事件主表中的事件数,然后使用动态sql向上述查询添加相同数量的列,然后执行

SET @S = ' <construct the query> like the sample above ';
PREPARE n_StrSQL FROM @S;
EXECUTE n_StrSQL;
DEALLOCATE PREPARE n_StrSQL;

希望这有助于

对于mssql服务器,我们可以使用pivot、forxml方法进行行到列的转换。