试图弄清楚是否有可能编写一个基于集合的查询,以便在一个表中返回我想要的数据。下面只是一个例子,如果大多数(但不是全部)组合1到9(或1到20等)存在,我需要一些可以轻松工作的东西。
表AllCovered有两列。 ID1和ID2。这个表中有16行,每行包含1到4的数字组合(所以1,1 1,2 1,3 1,4 2,1 .... 4,3 4,4)
表SomeGaps具有相同的结构,但只有12行,每行又是1到4的组合,但缺少一些组合。
SELECT ID1, ID2, COUNT(ID1) as THIS
FROM AllCovered
GROUP BY ID1, ID2
- 此查询返回16行,每个组合在第3列(THIS)中为1
SELECT ID1, ID2, COUNT(ID1) as THIS
FROM SomeGaps
GROUP BY ID1, ID2
- 返回12行。 如何创建将返回16行的查询,每个组合但在此处为0,对于某些组合中缺少的组合?
ID1 ID2 THIS
1 1 1
1 2 0 (1,2 combination does NOT exist in SomeGaps)
1 3 1
1 4 1
2 1 1
2 2 0 (2,2 combination does NOT exist in SomeGaps)
显然我已尝试使用交叉连接来获取ID1和ID2的所有组合,但COUNT正如预期的那样大幅膨胀。
希望这是有道理的。抱歉,如果它是一个简单的解决方案,我似乎无法破解它!
答案 0 :(得分:2)
您可以通过交叉连接两列的所有不同值来执行此操作。然后使用left outer join
和聚合来获取所有组合的计数:
select ac.id1, ac.id2, count(ac.id1) as cnt
from (select distinct id1 from AllCovered) ac1 cross join
(select distinct id2 from AllCovered) ac2 left join
AllCovered ac
on ac.id1 = ac1.id1 and ac.id2 = ac2.id2
group by ac.id1, ac.id2;
答案 1 :(得分:0)
我可能遗漏了一些显而易见的东西,但我还是会咬一口:
create table #AllCovered (id1 int, id2 int);
insert #AllCovered values
(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4),(3,1),(3,2),(3,3),(3,4),(4,1),(4,2),(4,3),(4,4);
create table #gaps (id1 int, id2 int);
insert #gaps values(1,1),(1,2),(1,3),(1,4),(2,1),(2,4),(3,1),(3,2),(3,3),(4,1),(4,2),(4,4);
select #AllCovered.id1, #AllCovered.id2,
count(#gaps.id1) as this
from #AllCovered
left outer join #gaps
on #AllCovered.id1 = #gaps.id1 and #AllCovered.id2 = #gaps.id2
group by #AllCovered.id1, #AllCovered.id2;
drop table #AllCovered, #gaps
从你的叙述中,两个表中都没有(id1,id2)的重复组合,AllCovered包含所有可能的组合 - 否则将使用不同的子查询并制作AllCovered。