2014-01-15 43 views
0

我有四个以父子关系构造的表。一个表具有一个主键,另外三个表(否则彼此不相关)将该主键作为外键。也就是说,表A有一个称为客户ID的主键。表B,C和D也有客户ID和一些其他信息。总结多表亲子关系的公共列

我想达到什么是总结表列2 B,C和D.我曾尝试:

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 

这将返回什么。我也尝试了一个返回空值的左外连接。我还与以下线,这是我真正想实现试了一下:

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分组。这是可能的,还是我需要重新考虑设计?

+0

如何加入列'JOIN dbo.b.column2'到一个表,不应该是表吗? – user2989408

+0

一旦你让这个人安顿下来,请举一个很好的例子 - 就像你在这里做的那样 - 为第二部分......也许在一个新的问题! –

+0

对于错字感到抱歉。我忙于剥夺桌子和桌子的名字,并无意中改变了那个名字。这仍然不会返回结果 – TXL

回答

1

如果您只需要选择一个单独的列,则可以使用APPLY而不是JOIN。
编辑:如果有任何NULL值此查询应该给你一个SUM ...
EDIT2:改变了CROSS APPLYOUTER APPLY,因为在案件的款项之一是不存在的,整个行将被从结果中下降。

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 
+0

这工作。正如我上面发布的,我认为问题的关键是如何处理这个问题“好吧,我想我已经发现问题与你们的帮助有什么关系。a.primary_key可能不包含b.column1中的一个或多个值,c.column1和d.column1“ – TXL

+0

这应该可能是一个新问题,但如果我想将顶部位更改为b.sum + c.sum + d.sum,则返回空值。即时猜测我需要赶上空值的某种方式 – TXL

+0

@TSScoder我已经发布了一个修改后的查询,也将选择三个SUM的总和..火上烧 – user2989408

0

从你的例子中清楚的一点是,你不小心将列名放入JOIN表名中。

变化

INNER JOIN 
dbo.b.column2 

INNER JOIN 
dbo.b 

,并同其他两个。

+0

抱歉,删除列名称时出错。这仍然没有结果。 – TXL

+0

嗯。关于您的查询,除此之外没有任何显着的结果你能抽出一些样本数据并在这里发布吗?理想情况下,将其编写为CREATE和INSERT语句,以便我们可以重新创建场景。 –