0

我有各种大型视图/存储过程,它们基本上将大量数据生成到 Excel 电子表格中。存在一个问题,并非所有公司金额都没有流过。我将其缩小为存储过程中的一段代码:(注意,为简单起见,已将其缩减)

 LEFT OUTER JOIN view_creditrating internal_creditrating 
                        ON creditparty.creditparty = 
                           internalrating.company 
          LEFT OUTER JOIN (SELECT company, contract, SUM(amount) amount 
                            FROM   COMMON_OBJ.amount 
                            WHERE  status = 'Active' 
                            GROUP  BY company, contract) col 
                       ON vd.contract = col.contract 

有问题的表:

                    company  | contract | amount |
                             |          |        |
                    TVC      |   NULL   |  1006  |
                    KS       |   10070  | -2345  |
                    NYC-G    |   10060  | 334000 |
                    NYC-G    |   100216 | 4000   |
                    UECR     |   NULL   |     0  |
                    SP       |   10090  | 84356  |

基本上一些合同是空的。因此,当合同中有 LEFT OUTER JOIN 时,合同中的空值会退出并且不会流过……所以我决定根据公司来做。这也会导致问题,因为 company 不止一次出现在表中以显示不同的合同。通过此更改,查询变得模棱两可,因为它不知道我是想要合同 10060 的金额还是合同 100216 的金额,而且通常它给我的金额不正确。我考虑过将最后的 ON 子句保留为 company = company。这导致的问题最少......然后不知何故直接查询每个单元格值,因为它只影响几个单元格,所以会不一致。尽管我已经搜索过,但我认为这是不可能的。这可能吗??或者是否有另一种方法可以在数据库端解决这个问题?

4

1 回答 1

1

如您所见,问题出在ON子句及其对NULL的使用上。

NULL更改为可以匹配的值的一种方法是使用COALESCE,这会将子句更改为:

ON coalesce(vd.contract,'No Contract') = coalesce(col.contract,'No Contract')

这会将所有NULL变成“No Contract”,这会将NULL=NULL测试(将返回NULL)更改为'No Contract'='No Contract',这将返回True

于 2013-11-04T21:26:00.110 回答