MySQL选择将多个值显示为列

MySQL选择将多个值显示为列,mysql,sql,pivot,Mysql,Sql,Pivot,可能重复: 我不知道如何编写SQL语句来将表的不同值显示为单独的列…下面是一个示例: Table A - Project = = = = = = = = = = = = = = ID | Project = = = = = = = = = = = = = = 1 | Google Table B - Tasks = = = = = = = = = = = = = = = = = = = = = = = = = = = = ID | Project ID | Task_name |

可能重复:

我不知道如何编写SQL语句来将表的不同值显示为单独的列…下面是一个示例:

Table A - Project
= = = = = = = = = = = = = =
ID | Project
= = = = = = = = = = = = = =
1  | Google

Table B - Tasks
= = = = = = = = = = = = = = = = = = = = = = = = = = = =
ID  | Project ID    | Task_name | Date Complete
= = = = = = = = = =  = = = = = = = = = = = = = = = = = =
1   |  1            | Build     | 10/30/12
2   |  1            | Revise    | 11/15/12
3   |  1            | Launch    | 11/30/12
以下格式的SQL输出:

Website   | Build Date  | Revise Date   | Launch Date
= = = = = = = = = =  = = = = = = = = = = = = = = = = = =
Google    | 10/30/12    | 11/15/12      | 11/30/12  

通过自联接,您可以很容易地做到这一点:

SELECT DISTINCT
   p.project_id,
   p_build.date_complete As 'Build Date',
   p_revise.date_complete As 'Revise Date',
   p_launch.date_complete As 'Launch Date'
FROM Tasks p
LEFT JOIN Tasks p_revise ON p_revise.project_id = p.project_id 
  AND p_revise.task_name = 'Revise'
LEFT JOIN Tasks p_build ON p_build.project_id = p.project_id
  AND p_build.task_name = 'Build'
LEFT JOIN Tasks p_launch ON p_launch.product_id = p.project_id
  AND p_launch.task_name = 'Launch'

这称为
PIVOT
,但MySQL没有
PIVOT
函数,但您可以使用聚合函数和
CASE
语句复制它:

select p.project as website,
  max(case when t.task_name = 'build' then date_format(`Date Complete`, '%m/%d/%y') end) BuildDate,
  max(case when t.task_name = 'Revise' then date_format(`Date Complete`, '%m/%d/%y') end) ReviseDate,
  max(case when t.task_name = 'Launch' then date_format(`Date Complete`, '%m/%d/%y') end) LaunchDate
from project p
inner join tasks t
  on p.id = t.`Project ID`
group by p.project

结果:

| WEBSITE | BUILDDATE | REVISEDATE | LAUNCHDATE |
-------------------------------------------------
|  Google |  10/30/12 |   11/15/12 |   11/30/12 |

这是一个好的开始。@Judy-不完全是重复的。这是针对MySQL的,另一个是针对SQL server的,答案使用CTE和ROW_NUMBER()/PARTITION BY,这两个在MySQL中都不可用。+1,我更喜欢这个答案。