Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要获取两列的组合同时存在且不存在的行';t出口_Sql_Sql Server - Fatal编程技术网

Sql 需要获取两列的组合同时存在且不存在的行';t出口

Sql 需要获取两列的组合同时存在且不存在的行';t出口,sql,sql-server,Sql,Sql Server,试图弄清楚是否有可能编写一个基于集合的查询来返回我想要的数据,并将其放在一个表中。下面只是一个例子,如果组合1到9(或1到20等)的大多数(但不是全部)存在,我需要一些可以轻松工作的东西 表AllCovered有两列。ID1和ID2。此表中有16行,每行包含数字1到4的组合(因此1,1,2 1,3 1,4 2,1…4,3 4,4) 表SomeGaps具有相同的结构,但只有12行,同样,每行是1到4的组合,但缺少一些组合 SELECT ID1, ID2, COUNT(ID1) as THIS FR

试图弄清楚是否有可能编写一个基于集合的查询来返回我想要的数据,并将其放在一个表中。下面只是一个例子,如果组合1到9(或1到20等)的大多数(但不是全部)存在,我需要一些可以轻松工作的东西

表AllCovered有两列。ID1和ID2。此表中有16行,每行包含数字1到4的组合(因此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列中有1行(此)

-这将返回12行。如何创建一个查询,该查询将返回16行,每一个组合,但对于某些间隙中缺少的组合,该查询中包含0

显然,我已经尝试使用交叉连接来获得ID1和ID2的所有组合,但正如预期的那样,计数被大大夸大了


希望这是有意义的。道歉如果这是一个简单的解决办法,我似乎无法破解它

可以通过交叉连接两列的所有不同值来实现这一点。然后使用
左外联接
和聚合来获取所有组合的计数:

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;

我可能错过了一些明显的东西,但我还是要吃一口:

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

你能为
所有覆盖的
一些间隙
提供一个曲线球吗?我想我扔了一个曲线球,不应该扔。AllCovered并不存在——它只是一个例子。我的错误。我用不同的方法解决了这个问题。谢谢你的回答,很抱歉没有解释清楚。谢谢你的回答。抱歉解释得不好。谢谢你的回答。为一个拙劣的解释道歉。
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;
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