我有一个具有以下结构的数据库表:
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中表达这个吗?
提前致谢, 弗兰克
答案 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匹配的记录,最后选择该临时表的总和。