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