代码之家  ›  专栏  ›  技术社区  ›  NickF_93

SQL:Mege一行两行

  •  0
  • NickF_93  · 技术社区  · 7 年前

    在MySQL上,我想将2行合并为1行,例如:

    | 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 回复  |  直到 7 年前
        1
  •  3
  •   D-Shih    7 年前

    你的预期结果需要尝试使用 条件聚合函数 来吧。

    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 |
    
        2
  •  1
  •   L McClean    7 年前

    这个答案来自 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