Sql server 如何在没有外键关系的情况下获取三个不同表的列之和

Sql server 如何在没有外键关系的情况下获取三个不同表的列之和,sql-server,Sql Server,我有三张桌子,每个桌子都有相同的id和不同的费用。 我需要将所有唯一id的成本1、成本2、成本3之和显示为单个结果集 表1: id cost1 1 100 1 100 2 200 表2: id cost2 1 100 2 100 2 100 表3: id cost3 1 100 2 100 1 100 out应该类似于每个cost表中列的总和: 输出: id cost1 cost2 cost3 1 200 100 200 2 20

我有三张桌子,每个桌子都有相同的id和不同的费用。 我需要将所有唯一id的成本1、成本2、成本3之和显示为单个结果集

表1:

id  cost1
1   100
1   100
2   200
表2:

id  cost2
1   100
2   100
2   100
表3:

id  cost3
1   100
2   100
1   100
out应该类似于每个cost表中列的总和:

输出:

id  cost1 cost2 cost3
1   200   100   200
2   200   200   100

有谁能给我建议最好的解决办法。

你的问题不太清楚,但我认为你在寻找类似的解决办法

with costs1 as
(
    select ID
        , SUM(cost1) as cost1
    from table1
    group by ID
)
, costs2 as
(
    select ID
        , SUM(cost2) as cost2
    from table2
    group by ID
)
, costs3 as
(
    select ID
        , SUM(cost3) as cost3
    from table3
    group by ID
)

select c1.ID
    , c1.cost1
    , c2.cost2
    , c3.cost3
from costs1 c1
join costs2 c2 on c2.ID = c1.ID
join costs3 c3 on c3.ID = c1.ID

一个
UNION ALL
后跟一个
PIVOT
将比一个
JOIN
到每个表更有效地解决这个问题

WITH t1(id,costnum,cost) AS (
  SELECT id,'cost1',cost1 FROM Table1 UNION ALL
  SELECT id,'cost2',cost2 FROM Table2 UNION ALL
  SELECT id,'cost3',cost3 FROM Table3
)
SELECT *
FROM t1
PIVOT(SUM(cost) FOR costnum IN ([cost1],[cost2],[cost3])) t2

我们可以使用UNION ALL和派生表实现相同的功能

 select DISTINCT A.Id,
    SUM(A.cost1),
    SUM(A.cost2),
    SUM(A.cost3) from (
    select id,SUM(cost1)cost1,'' As Cost2,'' As cost3 from table1 
    GROUP BY  t.id
    UNION ALL
    select id,'' As Cost1,SUM(cost2)cost2,'' As cost3 from table2 
    GROUP BY  id
    UNION ALL
    select id,'' As Cost1,'' As cost2,SUM(t.cost3)cost3 from table3  
    GROUP BY  id )A
    GROUP BY A.Id

表中只有一个200,但它在输出中显示了两次。创建输出所用的逻辑是什么?我投票将这个问题作为离题题结束,因为根据目前的信息,不可能看到如何解决这个问题。@JamesBlack OP试图统计每个
id
表的总和,因此,
cost1
列将包含每个
id
的成本总和。先生,请帮助我,我已经更新了这个问题。我想查看一些性能统计数据,以支持这一更快的说法。如果我走这条路,我会使用交叉表而不是枢轴。我发现语法没有那么迟钝,性能测试已经证明交叉表在PIVOT上有一点优势。这个计划当然不那么复杂,即使没有时间评估,我也会说它的执行速度会快很多使用
内部联接
,如果某个特定id没有出现在一个表中,它将从所有表的摘要中删除。为了避免这种情况,您需要首先列出所有ID,然后根据该ID进行左连接。要查看此操作,请尝试插入表2值(3300),然后重新运行查询。输出中没有
id=3
。OP不清楚这是否是必需的。