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 语法,ISNULL
或 COALESCE
需要在外部查询中完成。
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;
我有一个使用 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 语法,ISNULL
或 COALESCE
需要在外部查询中完成。
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;