Sql 多表父子关系的公共列求和

Sql 多表父子关系的公共列求和,sql,sql-server,database,sql-server-2012,Sql,Sql Server,Database,Sql Server 2012,我有四个表,它们的结构是父子关系。一个表有一个主键,而其他三个表(彼此无关)则将该主键作为外键。也就是说,表A有一个主键,称为customer ID。表B、C和D也有customer ID和一些其他信息 我想要实现的是将表B、C和D的第2列相加。我尝试过: SELECT dbo.a.primary_key, SUM(dbo.b.column2) AS Expr1, SUM(dbo.c.column2) AS Expr2, SUM(dbo.d.colum

我有四个表,它们的结构是父子关系。一个表有一个主键,而其他三个表(彼此无关)则将该主键作为外键。也就是说,表A有一个主键,称为customer ID。表B、C和D也有customer ID和一些其他信息

我想要实现的是将表B、C和D的第2列相加。我尝试过:

SELECT dbo.a.primary_key,
       SUM(dbo.b.column2) AS Expr1,
       SUM(dbo.c.column2) AS Expr2, 
       SUM(dbo.d.column2) AS Expr3
FROM   dbo.a 
INNER JOIN dbo.b ON dbo.a.primary_key = dbo.b.column1 
INNER JOIN dbo.c ON dbo.a.primary_key = dbo.c.column1  
INNER JOIN dbo.d ON dbo.a.primary_key = dbo.d.column1
GROUP BY dbo.a.primary_key
这不会返回任何结果。我还尝试了一个返回null的左外连接。我还尝试了以下几行,这是我真正想要实现的:

SUM(dbo.b.column2) + SUM(dbo.c.column2) + SUM(dbo.d.column2) AS Expr1
这可能是由于糟糕的设计,因为我可以有效地将这三个表合并到一个表中,但我相信这样会更整洁


一旦我解决了这个问题,我想将其扩展为表B、C和D的第3列,这样它们就有一个日期字段,它是一个int,并链接回一个日期表(E)。我想同时将表A、B、C和D连接到新创建的E,按日期和A.primary_键分组。这是可能的,还是我需要重新考虑设计?

从您的示例中可以清楚地看到,您不小心在联接表名称中添加了列名

改变

INNER JOIN
dbo.b.column2


另外两个也一样。

如果只需要选择一列,可以使用APPLY而不是join。
编辑:如果存在任何
NULL
值,则此查询应为您提供一个
总和

EDIT2:将
交叉应用
更改为
外部应用
,因为如果其中一个和不存在,整行将从结果中删除

SELECT a.primary_key,
    b.Sum AS Expr1,
    c.Sum AS Expr2, 
    d.Sum AS Expr3,
    ISNULL(b.Sum, 0) + ISNULL(c.Sum, 0) + ISNULL(d.Sum, 0) as [GrandTotal]
FROM dbo.Agency_Table a
    OUTER APPLY (SELECT SUM(ISNULL(b.column2, 0)) [Sum] FROM dbo.b WHERE a.primary_key = b.column1) as b
    OUTER APPLY (SELECT SUM(ISNULL(c.column2, 0)) [Sum] FROM dbo.c WHERE a.primary_key = c.column1) as c
    OUTER APPLY (SELECT SUM(ISNULL(d.column2, 0)) [Sum] FROM dbo.d WHERE a.primary_key = d.column1) as d

如何将一个列
JOIN dbo.b.column2
连接到一个表中,它不应该是一个表吗?一旦你解决了这个问题,请为第二部分做一个很好的例子,就像你在这里做的那样……也许是在一个新问题中!对不起,打错了。我正忙于剥离表和列的名称,却意外地更改了那个名称。这仍然不会返回任何结果如果将其更改为外部联接,是否会返回
主键
值,并且没有求和?是的,这是正确的。很抱歉,删除列名时出错了。这仍然不会返回任何结果。你的问题没有什么特别之处。你能提取一些样本数据并发布在这里吗?理想情况下,将其脚本化为CREATE和INSERT语句,这样我们就可以重新创建场景了。正如我在上面所发布的,我认为问题在于“好的,我想我已经在你们的帮助下发现了问题所在。有可能a.primary_键不包含b.column1、c.column1和d.column1中的一个或多个值”这可能是一个新问题,但如果我想将顶部位更改为b.sum+c.sum+d.sum会返回一个空值。我猜我需要捕捉一些空值way@TSScoder我发布了一个修改后的查询,该查询还将选择三个总和。。
SELECT a.primary_key,
    b.Sum AS Expr1,
    c.Sum AS Expr2, 
    d.Sum AS Expr3,
    ISNULL(b.Sum, 0) + ISNULL(c.Sum, 0) + ISNULL(d.Sum, 0) as [GrandTotal]
FROM dbo.Agency_Table a
    OUTER APPLY (SELECT SUM(ISNULL(b.column2, 0)) [Sum] FROM dbo.b WHERE a.primary_key = b.column1) as b
    OUTER APPLY (SELECT SUM(ISNULL(c.column2, 0)) [Sum] FROM dbo.c WHERE a.primary_key = c.column1) as c
    OUTER APPLY (SELECT SUM(ISNULL(d.column2, 0)) [Sum] FROM dbo.d WHERE a.primary_key = d.column1) as d