ขอถามการselectข้อมูลใน Oracle Sql ค่ะ

คือว่ามี ข้อมูลใน table ตามนี้ค่ะ



ต้องการให้ข้อมูลของแต่ละplan มี tran_id ครบทั้ง 12 number    
จากข้อมูลจะเห็นว่า plan B มี tran_id ไม่ครบ ซึ่งขาด 1,2,3,7,8,และ12ไป    
ดังนั้น จึงต้องการselect ข้อมูลโดยให้มแสดงrecordของtran_idที่ขาดไป    
โดย record ที่ขาดไปจะต้องมีข้อมูลdate,amount=0     
    
อีกทั้งให้ mark flag     
ในกรณีrecordนั้น มีข้อมูลtran_id อยู่แล้ว ให้ flag=0    
    
แต่ในกรณีที่ recordนั้น เป็นrecord ที่เพิ่ม tran_idที่ขาด    
ถ้า amount=0 และเป็น record เริ่มต้น    
เช่น plan B ขาดtran_idตั้งแต่1-3ไป ให้ flag=2    
ถ้า amount=0 อยู่กลางทางถึงสิ้นสุดtran_idที่12 ให้ flag=1    
    
ดังผลลัพธ์ข้างล่างนี้    

ยังไงก็รบกวนช่วยหน่อยนะคะ นั่งคิดมาหลายวันแล้วค่ะแต่ไม่สำเร็จซักที

ขอบคุณค่ะ
แก้ไขข้อความเมื่อ
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
ขั้นตอนต่อไปก็มาจัดการกับค่า null
- อันดับแรก plan ง่ายมาก ก็เอามาจาก r
- date ก็ไม่ยากนัก ดูจากตารางแล้วก็คือบวกเอาตามปีงบประมาณ ก็ใช้ add_months
- tran_id ก็เอามาจาก r
- amount อันไหน null ก็ให้เป็น 0
แล้วก็มาถึงพระเอกของเรา คอลัมน์ flag ผมใช้ case when และ exists ตามที่เคยนึกไว้
1. ถ้า tran_id ไม่เป็น null ก็ให้เป็น 0
2. ถ้าไม่มีข้อมูลที่ plan ตรงกัน และ tran_id น้อยกว่าข้อมูลนี้ ก็ให้เป็น 2
3. ที่เหลือให้เป็น 1

สรุปออกมาเป็น sql ได้ด้งนี้
select r.c_plan,
  coalesce(t.c_date, add_months(to_date('20131001', 'RRRRMMDD'), r.run_id - 1)) c_date,
  r.run_id c_tran_id,
  coalesce(t.c_amount, 0) c_amount,
  case
    when t.c_tran_id is not null then 0
    when not exists (
      select *
      from tmp_test t1
      where t1.c_plan = r.c_plan
        and t1.c_tran_id < r.run_id
    ) then 2
    else 1
  end flag
from (
    select *
    from (
        select distinct c_plan from tmp_test
      )
      cross join tmp_run
  ) r
  left join tmp_test t on t.c_tran_id = r.run_id and t.c_plan = r.c_plan
order by r.c_plan, r.run_id
;

ผลลัพธ์
| A | 2013-10-01 |  1 | 10 | 0 |
| A | 2013-11-01 |  2 | 10 | 0 |
| A | 2013-12-01 |  3 | 10 | 0 |
| A | 2014-01-01 |  4 | 10 | 0 |
| A | 2014-02-01 |  5 | 10 | 0 |
| A | 2014-03-01 |  6 | 10 | 0 |
| A | 2014-04-01 |  7 | 10 | 0 |
| A | 2014-05-01 |  8 | 10 | 0 |
| A | 2014-06-01 |  9 | 10 | 0 |
| A | 2014-07-01 | 10 | 10 | 0 |
| A | 2014-08-01 | 11 | 10 | 0 |
| A | 2014-09-01 | 12 | 10 | 0 |
| B | 2013-10-01 |  1 |  0 | 2 |
| B | 2013-11-01 |  2 |  0 | 2 |
| B | 2013-12-01 |  3 |  0 | 2 |
| B | 2014-01-01 |  4 | 10 | 0 |
| B | 2014-02-01 |  5 | 10 | 0 |
| B | 2014-03-01 |  6 | 10 | 0 |
| B | 2014-04-01 |  7 |  0 | 1 |
| B | 2014-05-01 |  8 |  0 | 1 |
| B | 2014-06-01 |  9 | 10 | 0 |
| B | 2014-07-01 | 10 | 10 | 0 |
| B | 2014-08-01 | 11 | 10 | 0 |
| B | 2014-09-01 | 12 |  0 | 1 |
แสดงความคิดเห็น
อ่านกระทู้อื่นที่พูดคุยเกี่ยวกับ  การพัฒนาซอฟต์แวร์ ซอฟต์แวร์
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่