2017-02-18 223 views
-1

我有一个关于从另一个表中添加多个列值的问题,并作为添加列返回给结果。SQL查询添加多列

这是我的第一张桌子。

attID | val1 | val2 | val3 | att | 
-----------+---------+---------+----------+---------+ 
    1  | 10 | 10 | 10  | P | 
    1  | 20 | 20 | 20  | M | 
    1  | 30 | 30 | 30  | HA | 
    2  | 1  | 1  | 1  | P | 
    2  | 2  | 2  | 2  | M | 
    2  | 3  | 3  | 3  | HA | 

我的第二个表是

ID | name | attID | 
---------+--------+---------+ 
    101 | luke | 1  | 
    102 | zik | 2  | 

我想要的结果是:

ID | name |  P  | M  |  HA  | 
-----+--------+--------------+----------+------------+ 
101 | luke |  30  | 60  |  90  | 
102 | zik |  3  | 6  |  9  | 

列VAL1 VAL2和VAL3由ATT添加,并添加到结果表的另一列我的解决方案

select 
    ID, Name, 
    (val1 + val2 + val3) P, 
    (val1 + val2 + val3) M, 
    (val1 + val2 + val3) HA 
from 
    t1, t2 
where 
    t1.attid = t2.addid 
group by 
    att 

我试过很多次,但事先无法找出解决的办法

感谢,如果有人可以给我真正的解决方案

+0

请发表你已经试过什么一个例子,什么结果是 – metame

+1

[不良习惯踢:使用旧样式的JOIN(http://sqlblog.com /blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 旧式*逗号分隔的表*样式列表已替换为*在ANSI - ** 92 ** SQL标准(** 25年**前)中使用ANSI + JOIN'语法,并且不鼓励使用 –

回答

1

您可以join,聚集做到这一点,一些算术:

select t2.ID, t2.name , 
     sum(case when att = 'P' then val1 + val2 + val3 end) as P, 
     sum(case when att = 'M' then val1 + val2 + val3 end) as M, 
     sum(case when att = 'HA' then val1 + val2 + val3 end) as HA 
from t2 left join 
    t1 
    on t2.attId = t1.attId 
group by t2.ID, t2.name ; 

在你的例子中,没有任何值是NULL。如果是这种情况,你要小心并使用coalesce()。我想我会推荐一个子查询:

select t2.ID, t2.name , 
     sum(case when att = 'P' then val end) as P, 
     sum(case when att = 'M' then val end) as M, 
     sum(case when att = 'HA' then val end) as HA 
from t2 left join 
    (select t1.*, 
      (coalesce(val1, 0) + coalesce(val2, 0) + coalesce(va3, 0) 
      ) as val 
     from t1 
    ) t1 
    on t2.attId = t1.attId 
group by t2.ID, t2.name ; 
+0

谢谢你的回答,这将是最好的。但如果我将此应用于我的真实表格,则出现错误。错误是说“不是单组功能”, –

+0

@VonAso。 。 。这些查询看起来是正确的,特别是从聚合的角度来看。这个错误通常发生在'select'中不包含'group by'的列中。 –

+0

@VonAso - 查询是正确的,我只是测试它(除了第二个'att'值是'M'而不是'PM')。 'coalesce'似乎并不是正确的解决方案(即使所有值都为null,在这种情况下,通过** any **合理的定义,结果应该为null),它将产生0。并且只有在聚合之后才能完成加入,而不是在之前减少基数,但这只是关于效率而不是正确性。所写的查询是正确的,运行良好。 – mathguy