Sql 对表中的所有行求和

Sql 对表中的所有行求和,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要对表中所有可能的原始对求和的sql查询 我的桌子看起来像这样: ID | Name | Value 1 | A | 100 2 | B | 150 3 | C | 250 4 | D | 600 在这种情况下,查询输出应为: FistName | SecondName | Sum A | B | 250 A | C | 350 A | D | 7

我需要对表中所有可能的原始对求和的sql查询

我的桌子看起来像这样:

ID | Name | Value 1 | A | 100 2 | B | 150 3 | C | 250 4 | D | 600 在这种情况下,查询输出应为:

FistName | SecondName | Sum A | B | 250 A | C | 350 A | D | 700 B | C | 400 B | D | 750 C | D | 850 试试这个:

select 
    t1.Name as FirstName,
    t2.Name as SecondName,
    t1.Value+t2.Value as Sum
from yourtable as t1
inner join yourtable as t2 on (t1.ID<t2.ID)

使用很少使用的笛卡尔连接的机会,以及交叉连接操作符:

select left.Name, right.Name, left.Value + right.Value as Sum
from DataTable left
  cross join DataTable right
order by left.Name, right.Name;

注意,如果输入表很大,这将导致大量行。为了避免行以两种方式合并,并避免它们自身出现{A,B}和{B,A},可以添加出现{A,A}的条件。

只需基于l.ID
这是一种有效的方法:

CREATE TABLE #T (ID INT, Name VARCHAR (10), VALUE INT)
INSERT INTO #T VALUES (1, 'A', 100), (2, 'B', '150'), (3, 'C', 250), (4, 'D', 600)

SELECT CASE WHEN T.Name < T2.Name THEN (T.Name + T2.Name)  
          ELSE (T2.Name + T.Name) 
      END AS FullName,
      SUM (T.Value) AS TotalValue
FROM #T AS T
FULL OUTER JOIN #T AS T2 ON T.Name <> T2.Name
GROUP BY CASE WHEN T.Name < T2.Name THEN (T.Name + T2.Name)  
            ELSE (T2.Name + T.Name)  END

这是一个简单的交叉连接表与它自己,并选择了它。你的问题是什么,你的sql语句在哪里,你试图解决什么问题,你的解决方案哪里错了?你想要所有的组合或排列吗?在后一种情况下{A,B}不同于{B,A};您正在显示组合…可能重复我不知道为什么这被否决,这是一个正确的答案。此解决方案的问题是它返回所需的两倍行,因为op只需要a-B行,而不需要B-a行。@GeorgeMenoutis:,他写道,条件可以改变added@dnoeth-但是可以/应该证明这些条件是什么?请参阅我对问题的评论:不清楚需要什么其他答案正在假设…与这里的其他答案中的半笛卡尔积相比,似乎过于复杂了?我确信有更复杂的方法来获得预期结果:-@MatBailie这是1个case语句、1个join和1个groupby。过分复杂可能会被过分夸大与一个连接相比,它要复杂得多,如果名称不唯一,则可能返回错误的答案
CREATE TABLE #T (ID INT, Name VARCHAR (10), VALUE INT)
INSERT INTO #T VALUES (1, 'A', 100), (2, 'B', '150'), (3, 'C', 250), (4, 'D', 600)

SELECT CASE WHEN T.Name < T2.Name THEN (T.Name + T2.Name)  
          ELSE (T2.Name + T.Name) 
      END AS FullName,
      SUM (T.Value) AS TotalValue
FROM #T AS T
FULL OUTER JOIN #T AS T2 ON T.Name <> T2.Name
GROUP BY CASE WHEN T.Name < T2.Name THEN (T.Name + T2.Name)  
            ELSE (T2.Name + T.Name)  END