Sql 如何查找缺少的行?

Sql 如何查找缺少的行?,sql,oracle,Sql,Oracle,我有一张如图所示的桌子 列MONTH_NO每年应具有1到12个月。几年来,我们有几个月没有加载数据。我需要一个查询,它将获取不包含所有12个月的年份以及缺少的月数 请帮助。像这样尝试: 将此信息发布到一个空的查询窗口中,并根据您的需要进行调整 MyData包含2013年全年,2014年9月失踪,2015年6月和9月失踪 DECLARE @OneToTwelve TABLE(Nmbr INT) INSERT INTO @OneToTwelve VALUES(1),(2),(3),(4),(5),(

我有一张如图所示的桌子

列MONTH_NO每年应具有1到12个月。几年来,我们有几个月没有加载数据。我需要一个查询,它将获取不包含所有12个月的年份以及缺少的月数

请帮助。

像这样尝试:

将此信息发布到一个空的查询窗口中,并根据您的需要进行调整

MyData包含2013年全年,2014年9月失踪,2015年6月和9月失踪

DECLARE @OneToTwelve TABLE(Nmbr INT)
INSERT INTO @OneToTwelve VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);

DECLARE @myData TABLE(yearNo INT, MonthNo INT)
INSERT INTO @myData VALUES
 (2013,1),(2013,2),(2013,3),(2013,4),(2013,5),(2013,6),(2013,7),(2013,8),(2013,9),(2013,10),(2013,11),(2013,12)
,(2014,1),(2014,2),(2014,3),(2014,4),(2014,5),(2014,6),(2014,7),(2014,8),(2014,10),(2014,11),(2014,12)
,(2015,1),(2015,2),(2015,3),(2015,4),(2015,5),(2015,7),(2015,8),(2015,10),(2015,11),(2015,12);

WITH AllYears AS
(
    SELECT DISTINCT yearNo FROM @myData
)
,AllCombinations AS
(
    SELECT *
    FROM @OneToTwelve AS months
    CROSS JOIN AllYears
)
SELECT * 
FROM AllCombinations
LEFT JOIN @myData AS md ON AllCombinations.Nmbr =md.MonthNo AND AllCombinations.yearNo=md.yearNo
WHERE md.MonthNo IS NULL
例如—

with mth
     as (select level as month_no
           from dual
         connect by level <= 12),
     yrs as (select distinct year from rag_month_dim)
select m.year, m.month_no
  from (select year, month_no
          from yrs, mth) m,
       rag_month_dim r
 where m.year = r.year(+)
   and m.month_no = r.month_no(+)
group by m.year, m.month_no
having max(r.month_no) is null
order by year, month_no

你有一年的数据中没有12个月的数据和总月份记录。

对于投票反对的人,请解释为什么海报不能改进问题/从中学习。我没有投票反对,但解释可能是:1图片中的测试数据使制定解决方案变得困难,2不,这是我尝试过的部分。请发布create和insert语句。并显示您的预期输出。请参阅。OP在Oracle而不是SQL Server上。@LalitKumarB,哦,是的。。。谢谢你的提示。。。也许答案有助于阐述一种方法。。。神奇的词语是理货表。在Oracle中,您只需使用分析函数MAX OVER。
 select distinct year, m.lev
  from rag_month_dim a
  join
  (
    select level lev
    from dual
    connect by level <= 12
  ) m
  on 1=1
  minus
  select year, month_no
  from rag_month_dim
  order by 1, 2
select * 
from (select count (-1) total, year from rag_month_dim group by year) as table
where total < 12.