我有这样的查询:
SELECT bgdepartemen.c_kodedept AS c_kodedept,
bgdepartemen.vc_namadept AS vc_namadept,
bgdivisi.c_kodediv AS c_kodediv,
bgdivisi.vc_namadiv AS vc_namadiv,
bggroup0.c_kodegrp0 AS c_kodegrp0,
bggroup0.vc_namagrp0 AS vc_namagrp0,
(SELECT COALESCE(SUM(bgbudget0.n_nilai))
FROM (bgbudget0 JOIN bggroup1 ON bgbudget0.c_kodegrp1 = bggroup1.c_kodegrp1)
WHERE bgbudget0.n_tahun = 2016 AND
bgbudget0.n_bulan >= 2 AND
bgbudget0.n_bulan <= 3 AND
bgbudget0.c_kodediv = bgdivisi.c_kodediv AND
bggroup1.c_kodegrp0 = bggroup0.c_kodegrp0 AND
bggroup1.c_kodegrp1 LIKE '%') AS nilai
FROM bgdivisi JOIN bggroup0 ON 1 = 1
JOIN bgdepartemen on bgdivisi.c_kodedept = bgdepartemen.c_kodedept
WHERE bgdivisi.c_kodediv LIKE '%' AND
bgdepartemen.c_kodedept LIKE '%' AND
bggroup0.c_kodegrp0 LIKE '%'
Run Code Online (Sandbox Code Playgroud)
而另一个像这样:
SELECT bgdepartemen.c_kodedept AS c_kodedept,
bgdepartemen.vc_namadept AS vc_namadept,
bgdivisi.c_kodediv AS c_kodediv,
bgdivisi.vc_namadiv AS vc_namadiv,
bggroup0.c_kodegrp0 AS c_kodegrp0,
bggroup0.vc_namagrp0 AS vc_namagrp0,
(SELECT COALESCE(SUM(bgrealisasi0.n_nilai))
FROM (bgrealisasi0 JOIN bggroup1 ON bgrealisasi0.c_kodegrp1 = bggroup1.c_kodegrp1)
WHERE bgrealisasi0.n_tahun = 2016 AND
bgrealisasi0.n_bulan >= 2 AND
bgrealisasi0.n_bulan <= 3 AND
bgrealisasi0.c_kodediv = bgdivisi.c_kodediv AND
bggroup1.c_kodegrp0=bggroup0.c_kodegrp0 AND
bggroup1.c_kodegrp1 LIKE '%') AS nilai
FROM bgdivisi JOIN bggroup0 ON 1 = 1
JOIN bgdepartemen on bgdivisi.c_kodedept = bgdepartemen.c_kodedept
WHERE bgdivisi.c_kodediv LIKE '%' AND
bgdepartemen.c_kodedept LIKE '%' AND
bggroup0.c_kodegrp0 LIKE '%'
Run Code Online (Sandbox Code Playgroud)
我想从那些表中选择条件
WHERE a.c_kodedept = b.c_kodedept AND
a.c_kodediv = b.c_kodediv AND
a.c_kodegrp0 = b.c_kodegrp0 AND
(a.nilai is not null or b.nilai is not null)
Run Code Online (Sandbox Code Playgroud)
但是我也想改变出现0的空记录,我已经尝试COALESCE但它仍然没有给我正确的结果.
通常,您首先要设置NULL值0,然后再设置SUM它们:
SELECT SUM(COALESCE(bgrealisasi0.n_nilai, 0)) ...
Run Code Online (Sandbox Code Playgroud)
否则,您的查询会有一些缺陷,例如field LIKE '%'这是一种非常低效的编写方式field IS NOT NULL.使用标量子查询使得整个查询确实难以阅读,并且如果重写为子查询,则可能优化连接.
你应该使用
SELECT COALESCE(SUM(bgbudget0.n_nilai), 0)
FROM .....
SELECT COALESCE(SUM(bgrealisasi0.n_nilai), 0)
FROM ....
Run Code Online (Sandbox Code Playgroud)
从 9.4 版开始,PostgresSUM会忽略空值:
所有非空输入值的表达式之和
https://www.postgresql.org/docs/9.4/functions-aggregate.html
请注意,如果所有输入均为空,则聚合值也将为空。
| 归档时间: |
|
| 查看次数: |
4891 次 |
| 最近记录: |