【问题标题】:Multiple SQL rows merge into single row if the id is same如果 id 相同,多条 SQL 行合并为单行
【发布时间】:2017-12-30 13:31:55
【问题描述】:

给定这个表我需要什么mysql来实现下面的结果:

表:

+----+-------+--------------
| name| id   |  items | vol
+----+-------+---------------
|  A | 1111  |  4     |  170
|  A | 1111  |  5     |  100
|  B | 2222  |  6     |  200
|  B | 2222  |  7     |  120
+----+-------+-----------------

上表是联合查询的结果

SELECT * FROM imports
union all
SELECT * FROM exports
ORDER BY name;

我想创建一个看起来像这样的临时视图

想要的结果:

+----+---------+---------+-------------------
| name| id     | items |  vol | items1 | vol2
+-----+--------+-------+--------------------
|  A  | 1111   |   4   |  170 |   5    | 100
|  B  | 2222   |   6   |  200 |   7    | 120
+----+---------+---------+-------------------

任何帮助将不胜感激! -谢谢

【问题讨论】:

  • 说“这是由 UNION 查询准备的一些数据,我怎样才能使它看起来像......”并不是很好,因为我们无法确定源数据的外观,我们需要知道,因为它会影响我们如何回答。这就像在说“如果答案是 4,那么问题是什么?” - 可能是 1+3、2+2、5-1 等...请拆分您的问题以分别显示进口数据和出口数据

标签: mysql sql


【解决方案1】:

使用 PIVOT:

SELECT name,id,
       SUM( CASE WHEN typ = 'imports' THEN items ELSE 0 END) as imports_items,
       SUM( CASE WHEN typ = 'imports' THEN vol   ELSE 0 END) as imports_vol,
       SUM( CASE WHEN typ = 'exports' THEN items ELSE 0 END) as exports_items,
       SUM( CASE WHEN typ = 'exports' THEN vol   ELSE 0 END) as exports_vol
FROM (
   SELECT 'imports' as typ, t.* FROM imports t
   union all
   SELECT 'exports' as typ, t.* FROM exports t
) x
GROUP BY name,id
ORDER BY name;

【讨论】:

  • 好吧,严格来说不使用pivot,但是却达到了同样的效果!
  • 感谢 krokodilko!
【解决方案2】:

这应该会为您提供您正在寻找的表格:

    SELECT 
        a.name, 
        a.id, 
        a.items, 
        a.vol, 
        b.items as items2, 
        b.vol as vol2
    FROM imports a 
        INNER JOIN exports b on b.id = a.id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多