如何编写将特定行值转换为新列的MySQL查询?

时间:2017-02-18 10:51:28

标签: mysql sql pivot

这是期望的结果:

sr no. | fullname      | email  
----------------------------------------
1.     | demo user     | demo@test.com 
2.     | sagar panchal | sagar@gmail.com

我试过了:

SELECT *
FROM `ds_tbl_event_question` q
LEFT JOIN `ds_tbl_event_participant` p ON q.event_id = p.event_id
AND p.question_id = q.event_question_id
LEFT JOIN `ds_events` e ON e.event_id = q.event_id
WHERE (
q.field_type = 'email'
OR q.field_type = 'full_name'
)
AND e.store_code = 'H9OCEN'
LIMIT 0 , 30

这给出了输出,如下图所示:

enter image description here

3 个答案:

答案 0 :(得分:2)

似乎只有字段created_date将您要从中获取full_nameemail的记录联系在一起。鉴于此,您可以按此created_date进行分组,并使用聚合函数(例如min)仅考虑answer - 具有特定field_type - 值的记录的值:

select
  min(CASE field_type WHEN 'full_name' THEN answer ELSE NULL END) as 'fullname',
  min(CASE field_type WHEN 'email' THEN answer ELSE NULL END) as 'email'   
FROM `ds_tbl_event_question` q
     LEFT JOIN `ds_tbl_event_participant` p ON q.event_id = p.event_id AND p.question_id = q.event_question_id
     LEFT JOIN `ds_events` e ON e.event_id = q.event_id
WHERE (
      q.field_type = 'email'
   OR q.field_type = 'full_name'
   )
   AND e.store_code = 'H9OCEN'
group by created_date

请注意,聚合函数(此处为:min)是必需的,因为select-clause不能包含除group by子句中列出的属性之外的其他属性,除非在聚合函数中使用。

在上面的查询中,我尝试尽可能少地调整您的查询。实际上可以进一步缩短查询:当您在左侧值使用WHERE条件时,左连接实际上变成了连接;并且field_type上的条件是多余的,因为case - 语句根本不考虑任何其他值:

select
  min(CASE field_type WHEN 'full_name' THEN answer ELSE NULL END) as 'fullname',
  min(CASE field_type WHEN 'email' THEN answer ELSE NULL END) as 'email'   
FROM `ds_tbl_event_question` q
     JOIN `ds_tbl_event_participant` p ON q.event_id = p.event_id AND p.question_id = q.event_question_id
     JOIN `ds_events` e ON e.event_id = q.event_id AND e.store_code = 'H9OCEN'
group by created_date

答案 1 :(得分:1)

尝试这样的事情:

SELECT full_names.answer AS full_name,
       emails.answer AS email FROM
(SELECT created_date
 FROM ds_tbl_event_question
 GROUP BY created_date) created_dates
JOIN 
(SELECT created_date, answer
 FROM ds_tbl_event_question
 WHERE field_type = 'full_name') full_names
ON full_names.created_date = created_dates.created_date
JOIN 
(SELECT created_date, answer
 FROM ds_tbl_event_question
 WHERE field_type = 'email') emails
ON emails.created_date = created_dates.created_date

请参阅Rextester演示:http://rextester.com/OBQ69221

答案 2 :(得分:1)

似乎关联的唯一方法是创建日期:

选择q.answer作为全名,       (从ds_tbl_event_question中选择答案,其中field_type =' email'和created_date = q.created_date)作为电子邮件 来自ds_tbl_event_question q其中q.field_type =' full_name';