对于连接多个表以查看来自多个源系统的聚合数据,UNION所有的替代方案是什么?我正在寻找超越T的解决方案.
假设我们有3个源表,并希望通过id连接它们:
TableA
id Adata
1 8383
2 2707
3 6181
4 6708TableB
id Bdata
1 2669
1 8582
2 6335
2 7355
3 7355
3 2277
4 2789
4 8566TableC
id Adata
1 2856
2 1364
3 4476
4 3311
4 8073我想要得到的结果表:

--我现在所做的获得它的原始方式(由UNION完成):

如果我们有许多列和许多表,通过创建由彼此之下的许多表和许多空表组成的大型表来达到预期的结果,似乎是非常令人沮丧和原始的解决方案。我认为,如果我们想加入不同的信息系统,如会计、工资、采购等,这是一个常见的问题。
最终目标是给和Excel用户聚合数据一个机会向下钻,仅限于选定的表。例如,通过双击第一个Bdata 11251中所需的结果表,用户将被扩展到只看到生成该数字的数据。但是,相反,用户得到了以下内容:

更新。我想保留一个在数据中向下钻取的机会。因此,如果我双击Excel中的结果表,我希望能够查看每个ID的所有细节。
发布于 2015-08-24 09:02:30
使用您的示例,一个简单的连接似乎就足够了,您为什么需要UNION ALL?
SELECT A.id,
SUM(A.Adata),
SUM(B.Bdata),
SUM(C.Cdata)
FROM TableA A
JOIN TableB B ON A.id = B.id
JOIN TableC C ON A.id = C.id
GROUP BY A.id如果要显示总体总数,可以使用WITH ROLLUP
SELECT ISNULL(sub.id,'Total') AS "id",
sub.Adata,
sub.Bdata,
sub.Cdata
FROM (
SELECT A.id,
SUM(A.Adata) AS Adata,
SUM(B.Bdata) AS Bdata,
SUM(C.Cdata) AS Cdata
FROM TableA A
JOIN TableB B ON A.id = B.id
JOIN TableC C ON A.id = C.id
GROUP BY A.id WITH ROLLUP) sub发布于 2015-08-24 09:33:05
你们是米希姆的概念。UNION ALL是很少需要和使用的东西。当将类似的结果集粘合在一起时,您可以使用它。这里不是这样的。
当然,为了连接表,应该使用联接。您将得到一个结果行(在您的例子中是ID )。您可以使用聚合函数,如SUM、MAX、COUNT等来聚合数据。
要写入的查询取决于表A和其他表中是否存在所有in。区别主要是当时使用的连接类型。
ID必须存在于所有表中:
select id, sum(a.adata), sum(b.bdata), sum(c.cdata)
from a
join b using (id)
join c using (id)
group by id;ID必须仅位于表a中:
select id, sum(a.adata), coalesce(sum(b.bdata),0), coalesce(sum(c.cdata),0)
from a
left join b using (id)
left join c using (id)
group by id;ID不必存在于任何特定的表中:
select id, coalesce(sum(a.adata),0), coalesce(sum(b.bdata),0), coalesce(sum(c.cdata),0)
from a
full outer join b using (id)
full outer join c using (id)
group by id;编辑:我应该补充一下,Server不支持USING子句(这是标准的SQL2003)。您可以用ON子句替换它,只要不需要完全的外部联接,这个子句就很简单,如果没有using子句,这个连接就复杂得多。
并且:通过使用group by rollup(id),而不是只使用group by id,在末尾得到一个sum行。
发布于 2015-08-24 09:08:55
你应该用内连接。除非某些表中缺少某些in,否则Union (All)似乎没有必要:
Select coalesce(cast(i.id as varchar(10)), 'SUM')
, isnull(sum(A.data), '')
, isnull(sum(B.data), '')
, isnull(sum(C.data), '')
From (Select id From A
Union Select id From B
Union Select id From C
) as i
left Join A on A.id = i.id
left Join B on B.id = i.id
left Join C on C.id = i.id
group by grouping sets (i.id, ())分组集将添加总行。
https://stackoverflow.com/questions/32178223
复制相似问题