Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL Server中基于ID的一列到多列_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql SQL Server中基于ID的一列到多列

Mysql SQL Server中基于ID的一列到多列,mysql,sql,sql-server,Mysql,Sql,Sql Server,我有一个表结构: ID |类型|值 1封电子邮件abcd@xyz.com 1部电话12345 2部电话56789 2工作电话546789 我想把它变成 ID |电子邮件|电话|工作电话 1.abcd@xyz.com12345空值 2空56789 546789 谁能帮我解决这个问题。对不起,如果这个问题以前重复过 使用条件聚合: select id , max(case when type = 'email' then value end) as email , max(case

我有一个表结构:

ID |类型|值
1封电子邮件abcd@xyz.com
1部电话12345
2部电话56789
2工作电话546789

我想把它变成

ID |电子邮件|电话|工作电话
1.abcd@xyz.com12345空值
2空56789 546789


谁能帮我解决这个问题。对不起,如果这个问题以前重复过

使用条件聚合:

select 
    id
  , max(case when type = 'email' then value end) as email
  , max(case when type = 'phone' then value end) as phone
  , max(case when type = 'workphone' then value end) as workphone
from t
group by id
pivot()
(在sql server中):

rextester演示:

两者都返回:

+----+--------------+-------+-----------+
| id |    email     | phone | workphone |
+----+--------------+-------+-----------+
|  1 | abcd@xyz.com | 12345 | NULL      |
|  2 | NULL         | 56789 | 546789    |
+----+--------------+-------+-----------+

上述解决方案的替代方案是SQL Server中的Pivot命令。以下答案仅适用于SQL Server。此语法不适用于MYSQL。你已经用两个标签标记了这个问题,所以我不确定你在运行哪个。如果您使用的是MSSQL,以下链接将深入介绍该命令 .

以下代码将实现您想要的结果:

   SELECT [ID] AS [ID],
       [Email] AS Email, 
       [Phone] AS Phone,
       [WorkPhone] AS WorkPhone
   FROM 
   (
        SELECT ID, 
               [TYPE], 
               [Value] 
        FROM dbo.Pivot_Ex
   ) AS FT
   PIVOT 
   (
        MAX([Value])
        FOR FT.TYPE IN ([Email], [Phone], WorkPhone)
   ) AS PivotTable1

搜索
pivot
谢谢。将进行检查。标记mysql和mssql不起作用…请为您的数据库类型选择一个或另一个。交叉表或Pivot是您在这里尝试的内容基本上我在MySQL中也有相同的数据,所以我不介意为MySQL获取解决方案,顺便说一句,感谢@TwelfthGo和MSSQL,您可以访问诸如此处显示的“Pivot”之类的命令。在MySQL中,您所能做的最好的事情是伪造它……SqlZim的答案显示了这两种情况。
   SELECT [ID] AS [ID],
       [Email] AS Email, 
       [Phone] AS Phone,
       [WorkPhone] AS WorkPhone
   FROM 
   (
        SELECT ID, 
               [TYPE], 
               [Value] 
        FROM dbo.Pivot_Ex
   ) AS FT
   PIVOT 
   (
        MAX([Value])
        FOR FT.TYPE IN ([Email], [Phone], WorkPhone)
   ) AS PivotTable1