PIVOT 函数返回 NULL 值和 ISNULL 不删除

PIVOT function returning NULL values and ISNULL not removing

我有一个使用 PIVOT 函数的查询,该函数具有希望在单元格中替换为 0 的 NULL 值。我试图将 ISNULL 添加到针对 O7CRAM 的子查询中,但没有删除 NULL 值

    select
        * 
    from 
    (
      select 
      O7ORNO,
      O7CRID,
      O7CRAM
    
      from MVXJDTA.OOLICH 
    ) src
    pivot
    (
      sum(O7CRAM)
      for O7CRID in ([PNP], [DTY], [HAN])
    ) piv
     order by O7ORNO;

我现在遇到的问题是 ISNULL 以及将其放置在何处以删除 NULL 值。

当前输出:

O7ORNO PNP DTY HAN
100000329 0.85 NULL NULL

期望的输出:

O7ORNO PNP DTY HAN
100000329 0.85 0.00 0.00

这里有一种方法可以使用称为 CROSSTAB 的古老、神秘但简单的“黑魔法”方法来做同样的事情。请注意您如何不需要明确的 ISNULL()s。

--===== Same as the PIVOT
 SELECT  O7ORNO
        ,PNP = SUM(IIF(O7CRID = 'PNP',O7CRAM,0)
        ,DTY = SUM(IIF(O7CRID = 'DTY',O7CRAM,0)
        ,HAN = SUM(IIF(O7CRID = 'HAN',O7CRAM,0)
   FROM MVXJDTA.OOLICH
  GROUP BY O7ORNO
  ORDER BY O7ORNO
;

row/column 总数和总计略有不同。

--===== Same as the PIVOT with row/column totals and grand total
 SELECT  O7ORNO
        ,PNP = SUM(IIF(O7CRID = 'PNP',O7CRAM,0)
        ,DTY = SUM(IIF(O7CRID = 'DTY',O7CRAM,0)
        ,HAN = SUM(IIF(O7CRID = 'HAN',O7CRAM,0)
        ,RowTotal = SUM(O7CRAM)
   FROM MVXJDTA.OOLICH 
  GROUP BY O7ORNO WITH ROLLUP
  ORDER BY GROUPING(O7ORNO),O7ORNO
;

有关 CROSSTAB 如何工作以及如何制作动态 CROSSTAB 的更多信息,请参阅以下链接中的文章:

https://www.sqlservercentral.com/articles/cross-tabs-and-pivots-part-1-converting-rows-to-columns-1

https://www.sqlservercentral.com/articles/cross-tabs-and-pivots-part-2-dynamic-cross-tabs

使用 PIVOT 语法,ISNULLCOALESCE 需要在外部查询中完成。

select O7ORNO, 
 isnull(PNP, 0) as PNP,
 isnull(DTY, 0) as DTY, 
 isnull(HAN, 0) as HAN
from (
  select O7ORNO, O7CRID, O7CRAM
  from MVXJDTA.OOLICH 
) src
pivot (
  sum(O7CRAM) 
  for O7CRID in (PNP, DTY, HAN)
) pvt
order by O7ORNO;
O7ORNO PNP DTY HAN
100000329 0.85 0.00 0.00

db<>fiddle here

条件聚合是另一种数据透视方法。

select O7ORNO
, SUM(CASE O7CRID WHEN 'PNP' THEN O7CRAM ELSE 0 END) AS PNP
, SUM(CASE O7CRID WHEN 'DTY' THEN O7CRAM ELSE 0 END) AS DTY
, SUM(CASE O7CRID WHEN 'HAN' THEN O7CRAM ELSE 0 END) AS HAN
from MVXJDTA.OOLICH  
group by O7ORNO
order by O7ORNO;