【问题标题】:MYSQL - Display multiple columns as different values in select and group byMYSQL - 在 select 和 group by 中将多列显示为不同的值
【发布时间】:2019-03-04 03:32:06
【问题描述】:

当我运行这个查询时,

select deviceId,value from table group by deviceId;

deviceId    value
T01         50
T01         60  
T01         65
T01         32
T02         34
T02         30  
T02         22
T02         15
T03         70
T03         78  
T03         80
T03         89

但我需要如下输出,

T01 T02 T03
50  34  70
60  30  78
65  22  80
32  15  89

如何使用 mysql 查询来实现这一点?

做这种格式的原因,我想把这样的数据写入excel文件。

【问题讨论】:

  • MySQL pivot table的可能重复
  • 你能至少解释一下输出中的行值的逻辑吗?
  • 认真考虑处理应用代码中数据显示的问题
  • 所有 deviceId 的值是否都相同?

标签: mysql


【解决方案1】:

这可以在 MySQL 中完成,但几乎可以肯定在您的应用程序框架中更容易完成。无论如何,如果所有 deviceId 值在表中具有相同的行数(或者如果 T01 的值数 >= T02 >= T03),这个查询将为您提供您正在寻找的结果,但应该注意的是,不能真正保证输出中数据的顺序。该查询将人工行号分配给每个 deviceId 值,然后将每个 deviceId 的值集连接到该行号上:

SELECT t01, t02, t03
FROM (SELECT value AS t01, @rn1 := @rn1+1 AS rn
      FROM table1 t1
      JOIN (SELECT @rn1 := 0) rn1
      WHERE deviceId = 'T01'
      ORDER BY rn) t1
LEFT JOIN (SELECT value AS t02, @rn2 := @rn2+1 AS rn
           FROM table1 t2
           JOIN (SELECT @rn2 := 0) rn1
           WHERE deviceId = 'T02'
           ORDER BY rn) t2 ON t2.rn = t1.rn
LEFT JOIN (SELECT value AS t03, @rn3 := @rn3+1 AS rn
           FROM table1 t1
           JOIN (SELECT @rn3 := 0) rn1
           WHERE deviceId = 'T03'
           ORDER BY rn) t3 ON t3.rn = t1.rn

输出:

t01     t02     t03
50      34      70
60      30      78
65      22      80
32      15      89

如果T02 的值多于T01,或T03 多于T02,则您必须对上述查询中的三个子查询执行FULL OUTER JOIN,这是MySQL 不直接支持的。 This question 可以告诉你如何做到这一点。

SQLFiddle Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2021-06-20
    相关资源
    最近更新 更多