总结多表父子关系的公共列

时间:2014-01-15 22:00:53

标签: sql sql-server database sql-server-2012

我有四个以父子关系结构的表。一个表具有主键,而另外三个表(否则彼此不相关)具有该主键作为外键。也就是说,表A具有称为客户ID的主键。表B,C和D还具有客户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_key分组。这是可能的,还是我需要重新考虑设计?

2 个答案:

答案 0 :(得分:1)

如果您只需要选择一个列,则可以使用APPLY而不是JOIN 编辑:如果有任何NULL值,此查询应该为您提供SUM ...
EDIT2 :将CROSS APPLY更改为OUTER APPLY,因为如果其中一个SUMS不存在,整个ROW将从结果中删除。

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

答案 1 :(得分:0)

您的示例中明确的一点是您不小心将列名放在JOIN表名中。

更改

INNER JOIN
dbo.b.column2

INNER JOIN
dbo.b

和其他两个相同。