Mysql 将SQL表展平为单个CSV友好表
由于某些原因,我正在接管一个需要以aCSV友好格式显示的数据库 目前有三个表。具有对象基本描述的对象,例如: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
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方法进行行到列的转换。