加入多个列?

时间:2009-11-25 15:28:04

标签: sql sql-server tsql

我有一个具有以下结构的数据库表:

id1 | id2 | weight

现在我想总结一下id1或id2给定值的所有条目的权重。

SELECT id, SUM(weight) FROM myTable WHERE id1=@id or id2=@id

通常,我需要获得多个ID的总和。为了加快速度,我首先在临时表中加载需要总和的ID。现在我不知道如何进行连接,以便获得所有ID的总和。如果只包含一列,则为

SELECT i.Id, SUM(weight)
FROM @IDs i JOIN myTable s1 ON i.Id=s1.id1 
GROUP BY i.Id

但是我不会得到id2 = @id的条目。我可以通过以下方式使用联合:

SELECT i.Id, SUM(weight)
FROM @IDs i JOIN myTable s1 ON i.Id=s1.id1 
GROUP BY i.Id
UNION
SELECT i.Id, SUM(weight)
FROM @IDs i JOIN myTable s2 ON i.Id=s1.id2 
GROUP BY i.Id

然后我会得到2个总和,一个累计超过id1 = @id,第二个超过id2 = @id。但是我希望在两个列上累积一个结果。

有人知道如何在SQL中表达这个吗?

提前致谢, 弗兰克

7 个答案:

答案 0 :(得分:3)

SELECT  id, SUM(weight)
FROM    (
        SELECT  i.id, s1.weight
        FROM    @IDs i
        JOIN    myTable s1
        ON      s1.id1 = i.id
        UNION ALL
        SELECT  i.id, s1.weight
        FROM    @IDs i
        JOIN    myTable s1
        ON      s1.id2 = i.id
        ) q
GROUP BY
        id

或者这个:

SELECT  i.id, SUM(CASE WHEN id = id1 THEN weight ELSE 0 END + CASE WHEN id = id2 THEN weight ELSE 0 END)
FROM    @ids i
JOIN    mytable s
ON      i.id IN (s.id1, s.id2)
GROUP BY
        id

如果mytable中的记录很少满足条件,则第一个更有效,如果有许多记录,则第二个更有效。

答案 1 :(得分:1)

SELECT
     MT.id1,
     MT.id2,
     SUM(MT.weight)
FROM
     @IDs IDs
INNER JOIN My_Table MT ON
     MT.id1 = IDs.id OR
     MT.id2 = IDs.id
GROUP BY
     id1,
     id2

或者如果你想要权重重复计算(一次用于id1,一次用于id2),那么:

SELECT
     IDs.id,
     SUM(MT.weight)
FROM
     @IDs IDs
INNER JOIN My_Table MT ON
     MT.id1 = IDs.id OR
     MT.id2 = IDs.id
GROUP BY
     id1,
     id2

答案 2 :(得分:0)

select t.id, Sum(s1.weight), Sum(s2.weight)
from table1 t
join table2 s1 on t.id1 = s1.id
join table2 s2 on t.id2 = s2.id
group by t.id

编辑:您可能也需要组中的重量列。

答案 3 :(得分:0)

为什么不以这种方式扩展 union 解决方案

select id,sum(s)
from(
  SELECT i.Id, SUM(weight) s
   FROM @IDs i JOIN myTable s1 ON i.Id=s1.id1 
   GROUP BY i.Id
   UNION
   SELECT i.Id, SUM(weight)
   FROM @IDs i JOIN myTable s2 ON i.Id=s1.id2 
   GROUP BY i.Id
)
group by id

答案 4 :(得分:0)

SELECT a.ID, SUM(a.Weight) FROM
(SELECT i.Id, weight
FROM @IDs i 
JOIN myTable s1 
    ON i.Id=s1.id1 
GROUP BY i.Id
UNION
SELECT i.Id, weight
FROM @IDs i 
JOIN myTable s2 
    ON i.Id=s1.id2 
GROUP BY i.Id) a

如果我理解你的话,这可能就是你想要的。

答案 5 :(得分:0)

我认为你只需要在你的JOIN子句中添加一个OR:

SELECT i.Id, SUM(weight)
FROM @IDs i JOIN myTable s1 ON i.Id=s1.id1 OR i.Id=s1.id2
GROUP BY i.Id

答案 6 :(得分:-1)

快速和脏的方法是创建一个临时表,将id匹配中的记录插入其中,然后插入id2匹配的记录,最后选择该临时表的总和。