SQL:将两行合二为一

时间:2018-08-10 08:33:56

标签: mysql sql

在MySQL上,我想合并1中的2行:

| Name | Value | Res |
| foo  | Type  | 0.2 |
| foo  | Group | aaa |
| bar  | Type  | 0.3 |
| bar  | Group | bbb |

我的预期结果是:

| Name | Type   | Group |
| foo  |  0.2   |  aaa  |
| bar  |  0.3   |  bbb  |

我想将两个具有某些公共值的条目合并到一个具有两列的列中,这两个列在Res列的值上区分Type列中的值。我怎样才能做到这一点? 谢谢

2 个答案:

答案 0 :(得分:3)

您的预期结果需要做枢纽尝试使用条件聚合函数来实现。

CREATE TABLE T(
   Name varchar(50),
     Value varchar(50),
     Res varchar(50)
);



insert into t values ( 'foo' ,'Type' , '0.2');
insert into t values ( 'foo' ,'Group' , 'aaa');
insert into t values ( 'bar' ,'Type' , '0.3');
insert into t values ( 'bar' ,'Group' , 'bbb');

查询1

SELECT Name,
      MAX(CASE WHEN Value= 'Type'  THEN Res END) Type,
      MAX(CASE WHEN Value= 'Group 'THEN Res END) `Group` 
FROM T
GROUP BY Name

Results

| Name | Type | Group |
|------|------|-------|
|  bar |  0.3 |   bbb |
|  foo |  0.2 |   aaa |

答案 1 :(得分:1)

这个来自Stack Exchange的答案-应该非常有用。

为此,您将需要运行两个子查询,然后将结果与JOIN命令结合起来。

假设您的表名为T:

SELECT s.`Name`, s.`type`, p.`group`
FROM 
(
  SELECT `Name`, `Res` as `type`
  FROM T  WHERE `Value`="type1"
) s
LEFT JOIN
(
  SELECT `Name`, `Res` as `group`
  FROM T
  WHERE `Value`="group1"
) p
ON s.`Name` = p.`Name`

我知道您的示例对变量名进行了更改以便于阅读-但请谨慎选择,因为它们在MySQL中可能是保留字。

这可以在此fiddle

中看到