select
dt.total_paket,dt.total_paket_selesai,dt.total_pagu,dt.pagu_selesai,dt.penawaran,dt.selisih,dt.selisih_persen,
thn.tahun as tahun_lelang
from (select TO_CHAR((current_date - interval '1 year' * a),'YYYY') AS tahun FROM generate_series(0,4,1) AS s(a)) thn
LEFT JOIN
(select
count(semualelang) as total_paket,
count(selesailelang) as total_paket_selesai,
sum(semualelang.pkt_pagu) as total_pagu,
sum(selesailelang.pagu_selesai) as pagu_selesai,
sum(selesailelang.penawaran) as penawaran,
sum(selesailelang.pagu_selesai) - sum(selesailelang.penawaran) as selisih,
round((sum(selesailelang.pagu_selesai) - sum(selesailelang.penawaran))/sum(selesailelang.pagu_selesai) * 100::numeric) AS selisih_persen,
date_part('YEAR', semualelang.lls_tgl_setuju) as tahun_lelang
from(
select agen.agc_nama,sk.stk_id,sk.stk_nama,ls.lls_id,ls.pkt_id,sd.sbd_id,sd.sbd_ket,a.ang_tahun,p.pkt_nama,p.pkt_pagu,p.pkt_hps,p.kgr_id,ls.mtd_pemilihan,ls.lls_tgl_setuju from lelang_seleksi ls
left join paket p on ls.pkt_id=p.pkt_id
left join (select pa.pkt_id,pa.ang_id from paket_anggaran pa inner join (select pkt_id,max(auditupdate) as auditupdate from paket_anggaran group by pkt_id) pa1 on pa1.pkt_id=pa.pkt_id and pa1.auditupdate=pa.auditupdate) pa on pa.pkt_id=p.pkt_id
left join satuan_kerja sk on p.stk_id=sk.stk_id
left join agency agen on agen.agc_id=sk.agc_id
left join anggaran a on pa.ang_id=a.ang_id
left join sumber_dana sd on a.sbd_id=sd.sbd_id
where ls.lls_status=1) semualelang
left join (
select e.lls_id,n.psr_id,pemenang.pagu_selesai,pemenang.nev_harga,min(n.nev_harga) as penawaran,pemenang.eva_jenis from evaluasi e inner join nilai_evaluasi n on e.eva_id=n.eva_id
inner join (select n.psr_id,e.eva_id,ls.lls_id, p.pkt_pagu as pagu_selesai, n.nev_harga,e.eva_jenis from lelang_seleksi ls
inner join paket p on ls.pkt_id=p.pkt_id and ls.lls_status=1
inner join (select max(e.eva_versi) as mev, e.lls_id from evaluasi e inner join lelang_seleksi ls on e.lls_id=ls.lls_id where ls.lls_status=1 group by e.lls_id) me on ls.lls_id=me.lls_id
inner join evaluasi e on me.lls_id=e.lls_id AND e.eva_jenis = 4::numeric and e.eva_versi=me.mev
/*inner join workflow w on e.eva_wf_id = w.wf_id AND w.wf_state = 5::numeric */
inner join nilai_evaluasi n on e.eva_id = n.eva_id AND n.nev_lulus = 1::numeric
left join (select ls.lls_id,
CASE
WHEN (select count(*) from jadwal j where now() BETWEEN j.dtj_tglawal and j.dtj_tglakhir and j.lls_id=ls.lls_id) > 0 THEN '0'::numeric
ELSE '1'::numeric
END
AS s_selesai
from lelang_seleksi ls order by ls.lls_id desc) tahapan on tahapan.lls_id=ls.lls_id
where ls.lls_status=1 and tahapan.s_selesai=1) pemenang on e.lls_id=pemenang.lls_id and n.psr_id=pemenang.psr_id
where e.lls_id=pemenang.lls_id and n.psr_id=pemenang.psr_id
group by e.lls_id,n.psr_id,pemenang.pagu_selesai,pemenang.nev_harga,pemenang.eva_jenis
)selesailelang on semualelang.lls_id=selesailelang.lls_id
group by date_part('YEAR', semualelang.lls_tgl_setuju)) dt
on cast(thn.tahun as double precision)=dt.tahun_lelang
ORDER BY thn.tahun ASC
回答
可以加快查詢速度像這樣與view,
- 概括所有的查詢來獲取一些模式
- 創建數據庫視圖
- 重新編寫所有的查詢
即 - a)使用此視圖 - >
SELECT agen.agc_nama,sk.stk_id,sk.stk_nama,ls.lls_id,ls.pkt_ id,sd.sbd_id,sd.sbd_ket,a.ang_tahun,p.pkt_nama,p.pkt_pagu,p.pkt_hps,p.kgr_id,ls.mtd_pemilihan,ls.lls_tgl_setuju FROM lelang_seleksi ls LEFT JOIN paket p ON ls.pkt_id = p.pkt_id LEFT JOIN(SELECT pa.pkt_id,pa.ang_id FROM paket_anggaran pa INNER JOIN(SELECT pkt_id,MAX(auditupdate)AS auditupdate FROM paket_anggaran GROUP BY pkt_id)pa1 ON pa1.pkt_id = pa.pkt_id AND pa1.auditupdate = pa.auditupdate)pa ON pa.pkt_id = p.pkt_id LEFT JOIN satuan_kerja sk ON p.stk_id = sk.stk_id LEFT JOIN agency agen ON agen.agc_id = sk.agc_id LEFT JOIN anggaran a ON pa.ang_id = a .ang_id LEFT JOIN sumber_dana sd ON a.sbd_id = sd.sbd_id WHERE ls.lls_status = 1
b)中然後使用此的視圖 -
SELECT e.lls_id,n.psr_id,pemenang.pagu_selesai,pemenang.nev_harga,MIN(n.nev_harga) AS penawaran,pemenang.eva_jenis FROM evaluasi e INNER JOIN nilai_evaluasi n ON e.eva_id=n.eva_id
INNER JOIN (SELECT n.psr_id,e.eva_id,ls.lls_id, p.pkt_pagu AS pagu_selesai, n.nev_harga,e.eva_jenis FROM lelang_seleksi ls
INNER JOIN paket p ON ls.pkt_id=p.pkt_id AND ls.lls_status=1
INNER JOIN (SELECT MAX(e.eva_versi) AS mev, e.lls_id FROM evaluasi e INNER JOIN lelang_seleksi ls ON e.lls_id=ls.lls_id WHERE ls.lls_status=1 GROUP BY e.lls_id) me ON ls.lls_id=me.lls_id
INNER JOIN evaluasi e ON me.lls_id=e.lls_id AND e.eva_jenis = 4::NUMERIC AND e.eva_versi=me.mev
/*inner join workflow w on e.eva_wf_id = w.wf_id AND w.wf_state = 5::numeric */
INNER JOIN nilai_evaluasi n ON e.eva_id = n.eva_id AND n.nev_lulus = 1::NUMERIC
LEFT JOIN (SELECT ls.lls_id,
CASE
WHEN (SELECT COUNT(*) FROM jadwal j WHERE NOW() BETWEEN j.dtj_tglawal AND j.dtj_tglakhir AND j.lls_id=ls.lls_id) > 0 THEN '0'::NUMERIC
ELSE '1'::NUMERIC
END
AS s_selesai
FROM lelang_seleksi ls ORDER BY ls.lls_id DESC) tahapan ON tahapan.lls_id=ls.lls_id
WHERE ls.lls_status=1 AND tahapan.s_selesai=1) pemenang ON e.lls_id=pemenang.lls_id AND n.psr_id=pemenang.psr_id
WHERE e.lls_id=pemenang.lls_id AND n.psr_id=pemenang.psr_id
GROUP BY e.lls_id,n.psr_id,pemenang.pagu_selesai,pemenang.nev_harga,pemenang.eva_jenis
c)中然後使用此的視圖 -
SELECT
COUNT(semualelang) AS total_paket,
COUNT(selesailelang) AS total_paket_selesai,
SUM(semualelang.pkt_pagu) AS total_pagu,
SUM(selesailelang.pagu_selesai) AS pagu_selesai,
SUM(selesailelang.penawaran) AS penawaran,
SUM(selesailelang.pagu_selesai) - SUM(selesailelang.penawaran) AS selisih,
ROUND((SUM(selesailelang.pagu_selesai) - SUM(selesailelang.penawaran))/SUM(selesailelang.pagu_selesai) * 100::NUMERIC) AS selisih_persen,
date_part('YEAR', semualelang.lls_tgl_setuju) AS tahun_lelang
FROM() semualelang
LEFT JOIN()selesailelang ON semualelang.lls_id=selesailelang.lls_id
GROUP BY date_part('YEAR', semualelang.lls_tgl_setuju)
實際上這shouuld看起來像這樣 - >
SELECT
COUNT(semualelang) AS total_paket,
COUNT(selesailelang) AS total_paket_selesai,
SUM(semualelang.pkt_pagu) AS total_pagu,
SUM(selesailelang.pagu_selesai) AS pagu_selesai,
SUM(selesailelang.penawaran) AS penawaran,
SUM(selesailelang.pagu_selesai) - SUM(selesailelang.penawaran) AS selisih,
ROUND((SUM(selesailelang.pagu_selesai) - SUM(selesailelang.penawaran))/SUM(selesailelang.pagu_selesai) * 100::NUMERIC) AS selisih_persen,
date_part('YEAR', semualelang.lls_tgl_setuju) AS tahun_lelang
FROM semualelang_view
LEFT JOIN selesailelang_view ON semualelang_view.lls_id=selesailelang_view.lls_id
GROUP BY date_part('YEAR', semualelang_view.lls_tgl_setuju)
這不是一個正確的代碼 - 你必須找到你自己的方式,這只是PSEDUO流程如何實現你的目標。
- 1. 如何加快查詢速度?
- 2. 如何加快SQL查詢速度
- 3. 如何加快查詢速度
- 4. SQL--加快查詢速度
- 5. 如何加快我的查詢速度。子查詢太慢
- 6. 加快查詢執行速度
- 7. 使用LINQ加快查詢速度
- 8. 加快mysql查詢的速度
- 9. 加快軌道查詢速度
- 10. 遊標查詢速度慢,但個別查詢速度快
- 11. 如何快速查詢
- 12. 如何優化JPQ JOIN查詢以加快運行速度
- 13. 無法修改PostgreSQL查詢,如何加快速度
- 14. 如何簡化多選查詢以加快執行速度?
- 15. 慢速查詢,我可以加快速度嗎?
- 16. MySQL查詢速度加入
- 17. JOIN或子查詢速度更快嗎?
- 18. 速度快:查詢語法與循環
- 19. 優化Mysql UNION查詢以加快加載速度
- 20. mysql第一次查詢速度慢,然後快速查詢相關查詢
- 21. 在latin1中查詢速度很快,utf8速度慢 - 爲什麼?
- 22. Hibernate - SQL速度很快,但查詢速度仍然很慢
- 23. PHP查詢速度慢但客戶端速度很快
- 24. 快速CSS查詢
- 25. 快速查詢hbase
- 26. 在oracle sql developer中加入查詢速度很快,在odp.net中速度很慢
- 27. 如何快速解決此查詢?
- 28. 如何快速創建子查詢
- 29. 如何快速查詢文件系統?
- 30. 如何快速查詢大數據?
請說明您的具體問題或添加其他詳細信息,以確切地突出顯示您的需求。正如目前所寫,很難確切地說出你在問什麼。請參閱「如何問問」頁面以獲取有關澄清此問題的幫助。 – GabrielOshiro
有了這種JOINs /複雜程度,有人必須在現場幫助。詢問您的DBA或投資一位優秀的DBA顧問。 – zedfoxus
不是每個人都會說印尼文 – Lucius