【问题标题】:MySQL: Move data from multiple rows to one row based on column valueMySQL:根据列值将数据从多行移动到一行
【发布时间】:2017-01-11 18:27:40
【问题描述】:

我有以下格式的 MySQL 表。这是我运行的程序的输出,我无法更改它。

+---+------------------------+
|   |  A    B   C   D    E   |
+---+------------------------+
|   | model amz wmt abt tgt  |
| 1 | c3000 100              |
| 2 | c3000     200          |
| 3 | c3000         150      |
| 4 | c3000              125 |
| 5 | A1234              135 |
| 6 | A1234     105          |
+---+------------------------+

我想根据第 1 列中的值(即模型)将所有行移动到一行中。需要注意的是,空白行实际上并不是空白的,而是包含一个空字符

期望的输出:

+---+-----------------------+
|   |  A    B   C   D    E  |
+---+-----------------------+
|   | model amz wmt abt tgt |
| 1 | c3000 100 200 150 125 |
| 2 | A1234 200 105     135 |
+---+-----------------------+

我尝试过使用

select model,group_concat(wmt),group_concat(amz)     
from table_name
group by model

我得到的输出充满了逗号

+---+----------------------------------+
|   |  A                  B            |
+---+----------------------------------+
|   | model  amz          wmt          |
| 1 | c3000  ,,,,100,,,,   ,,,200,,,,  |
| 2 | A1234  ,,200,,,,,,  ,105,,,,,,   |
+---+----------------------------------+

【问题讨论】:

  • 您得到逗号是因为您存储并清空了字符串'',其中缺少值。如果您使用 NULL 表示缺失值,group_concat() 将忽略 NULL。
  • @BillKarwin 我将数据加载到 MySQL 的软件发送 emtpy 字符串,这就是我不能使用 NULL 的原因。
  • 见函数NULLIF()

标签: mysql sql


【解决方案1】:

您可以使用 TRIM 和 IF 将空白值转换为 null。

SELECT 
    model,
    GROUP_CONCAT(IF(TRIM(wmt) = '', NULL, wmt)),
    GROUP_CONCAT(IF(TRIM(amz) = '', NULL, amz))
FROM
    table_name
GROUP BY model

【讨论】:

    【解决方案2】:
    SELECT
       model,
       MIN(amz) AS amz,
       MIN(wmt) AS wmt,
       MIN(abt) AS abt,
       MIN(tgt) AS tgt
    FROM
       table_name
    GROUP BY
       model
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2022-12-06
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多