คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 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 ได้ด้งนี้
ผลลัพธ์
- อันดับแรก 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
;
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 |
| 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 |
แสดงความคิดเห็น
อ่านกระทู้อื่นที่พูดคุยเกี่ยวกับ
การพัฒนาซอฟต์แวร์
ซอฟต์แวร์
ขอถามการselectข้อมูลใน Oracle Sql ค่ะ
ต้องการให้ข้อมูลของแต่ละ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
ดังผลลัพธ์ข้างล่างนี้
ยังไงก็รบกวนช่วยหน่อยนะคะ นั่งคิดมาหลายวันแล้วค่ะแต่ไม่สำเร็จซักที
ขอบคุณค่ะ