我在SQL Server 2008数据库中有一个包含两列,城市和区域的表。每个城市都有9个不同的区域值。例如,111,222,333,444,555,666,777,888,999。所以表格看起来像
city,area
city1,111
city1,222
....
city1,999
city2,111
city2,222
.....
city2,999
etc...
理想情况下,我喜欢每个城市和缺失区域的结果集。有没有办法编写一个可以执行此操作的select语句?
我意识到并非每个城市都有9个值,有61个城市至少缺少一个值,但我似乎无法确定缺少哪个值。
答案 0 :(得分:2)
是的,你可以这样做。创建city
和area
的所有组合,然后使用left outer join
查找缺失的值。
select c.city, a.area
from (select distinct city from cityarea) c cross join
(select distinct area from cityarea) a left outer join
cityarea ca
on ca.city = c.city and
ca.area = a.area
where ca.city is null;
答案 1 :(得分:0)
请告知是否有任何样本数据不起作用。
declare @t table(city varchar(50),area int)
insert into @t values('city1',111),('city1',222),('city1',444),('city2',111),('city2',222),('city2',333)
,('city2',444),('city2',555),('city2',777)
;with CTE as
(select *,ROW_NUMBER()over(partition by city order by area)rn from @t
)
select * from cte a
inner join cte b on a.city=b.city and b.rn-a.rn=1
where b.area-a.area>111