【问题标题】:sql query to show row data in columnssql查询在列中显示行数据
【发布时间】:2015-10-24 12:18:07
【问题描述】:

表结构

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 列的数据。

【问题讨论】:

  • 永远努力
  • 是的,你可以! (c) 奥巴马
  • 至少解释清楚
  • 现在你明白我想要什么了..@u_mulder
  • 不确定作业是否...我们不会为您做作业。我建议阅读 mysql 文档。

标签: mysql sql


【解决方案1】:

为此,您需要一种方法来确定每组中的前三项应该是什么。这样做的方法是添加一个为每个新组重新启动的行号。这在任何支持窗口函数的数据库中都很容易,但 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

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 2013-10-09
    • 1970-01-01
    • 2010-10-26
    • 2020-09-15
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多