加入时如何报告所有行?

How to report for all rows when joining?

我想报告所有满足 where batch_run > 200833 and batch_id=100

的 batch_runs

如果BATCH_RUN没有任何batch_id = 100,则报告0

  select batch_id,
       batch_run,
       count(*) over (partition by batch_id,
                                   batch_run
                          order by batch_run) as total_lot_count,
       sum(lot_size) over (partition by batch_id,
                                        batch_run) as total_lot_size,
       row_number() over (partition by batch_id
                               order by batch_run) as line_number

from batch_jobs  
-- inner join batches on batch_jobs.batch_run = batches.batch_run
-- left join batches on batch_jobs.batch_run = batches.batch_run  
where batch_run > 200833
and   batch_id = 100

Fidde

BATCHES
--------------- ----------
BatchSequence   Batch_run
--------------- ----------
1                200833
2                200911
3                200922
4                200933
5                201011
6                201022
7                201033


BATCH_RUNS
------------- ---------- ---------
Batch_id      Batch_run  Lot_size 
------------- ---------- ---------
100            200933      10     
100            200933      20     
100            200933      30     
100            201022     400     
100            201022     500     

想要的结果:

--------------- --------- ---------- ----- ---- -------   
Batch_Run       Batch_id  Lot_count  Total_Lots Line_No
--------------- --------- ---------- ----- ---- -------
200911                                 0    1
200922            100       3         60    2
200933                                 0    3
201011                                 0    4
201022            100       2        900    5
201033                                 0    6

很遗憾,您的 post 与您的 SQL Fiddle 不一致。这让一切都变得有些混乱。但我认为这就是你要找的。正如您将看到的,除了 row_number,解析函数并不是真正需要的。

select b.batch_run,
       bj.batch_id,
       count(bj.batch_run) as total_lot_count,
       coalesce(sum(bj.lot_size), 0) as total_lot_size,
       row_number() over (order by b.batch_sequence) as Line_No
  from batches b
  left join batch_jobs bj
    on bj.batch_run = b.batch_run
   and bj.batch_id = 100
 where b.batch_run > 200833
 group by b.batch_sequence, b.batch_run, bj.batch_id
 order by Line_No

SQLFiddle Demo