sql查询以列显示行数据

时间:2015-08-02 07:27:28

标签: mysql sql

表格结构

Table 1 
-------------
code  |  name 
-------------
1     |  abc 
2     |  xyz


Table 2
-------------------------------
code   |  table1_code  |  data
-------------------------------
1      |    1          |  a
2      |    1          |  b
3      |    1          |  c
4      |    1          |  d
5      |    1          |  e
6      |    2          |  f
7      |    2          |  g

现在预期结果:
结果

table1_code  | name  |   data_col1    |   data_col2   |  data_col3
------------------------------------------------------------------
1              abc       a                b              c
2              xyz       f                g              -

到目前为止我尝试了什么

SELECT a.code AS table1_code, 
       a.NAME, 
       b.data_col 
FROM   table1 AS a 
       LEFT OUTER JOIN table2 AS b 
                    ON a.code = b.table1_code 

请帮助我改变查询以获得以上输出,
我想要数据最多3列。

1 个答案:

答案 0 :(得分:0)

要执行此操作,您需要一种方法来确定每组中前三项应该是什么。执行此操作的方法是添加为每个新组重新启动的行号。这在任何支持窗口函数的数据库中都很容易,但MySQL不会因为你必须使用用户定义的变量来进行排名而变得有点复杂。

在下面的查询中,数据的排名是在用作源的派生表中完成的,然后执行条件聚合,以便每组获得一行:

SELECT
  code, 
  name,
  MAX(CASE WHEN rank = 1 THEN data END) data_col1,
  MAX(CASE WHEN rank = 2 THEN data END) data_col2,
  MAX(CASE WHEN rank = 3 THEN data END) data_col3
FROM (
  SELECT
    a.code, 
    a.name,
    b.data,
    ( 
      CASE a.name 
        WHEN @grp THEN @row := @row + 1 
        ELSE @row := 1 AND @grp := a.name
      END
    ) + 1 AS rank
  FROM table1 AS a 
  LEFT OUTER JOIN table2 AS b ON a.code = b.table1_code
  , (SELECT @row := 0, @grp := '') r
  ORDER BY a.code, a.name asc
) src
GROUP BY code, name;

Sample SQL Fiddle