sql SUM:用0更改null

And*_*ozu 3 sql postgresql

我有这样的查询:

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但它仍然没有给我正确的结果.

Pat*_*ick 7

通常,您首先要设置NULL0,然后再设置SUM它们:

SELECT SUM(COALESCE(bgrealisasi0.n_nilai, 0)) ...
Run Code Online (Sandbox Code Playgroud)

否则,您的查询会有一些缺陷,例如field LIKE '%'这是一种非常低效的编写方式field IS NOT NULL.使用标量子查询使得整个查询确实难以阅读,并且如果重写为子查询,则可能优化连接.


Pha*_*ach 6

你应该使用

SELECT COALESCE(SUM(bgbudget0.n_nilai), 0) 
FROM .....
SELECT COALESCE(SUM(bgrealisasi0.n_nilai), 0) 
FROM ....
Run Code Online (Sandbox Code Playgroud)


Chr*_*cki 5

从 9.4 版开始,PostgresSUM会忽略空值:

所有非空输入值的表达式之和

https://www.postgresql.org/docs/9.4/functions-aggregate.html

请注意,如果所有输入均为空,则聚合值也将为空。