SQL数据透视视图:NULL货币值导致额外行的合并求助
解决透视数据中NULL Currency/UOM导致的重复行问题
我完全懂你的困扰:SalesVolume对应的Currency是NULL,结果把同一维度下的记录拆成了两行——一行是带有效Currency的Net Revenue/Gross Margin,另一行是带NULL Currency的SalesVolume,这显然不是你想要的透视结果。
核心思路是:把同一维度分组内的NULL Currency替换成该组的有效Currency值,UOM同理,这样分组时就不会因为NULL产生额外行。这里可以用窗口函数来实现,先清洗数据再做聚合透视。
修改后的查询语句
WITH CleanedData AS ( SELECT Year, Period, [Year-Period], Region, [Op Co] AS OpCo, PMC, [PMC Description] AS PMCDescription, -- 用窗口函数提取同一核心分组内的非NULL Currency,替换当前行的NULL COALESCE(Currency, MAX(Currency) OVER ( PARTITION BY Year, Period, [Year-Period], Region, [Op Co], PMC, [PMC Description], [Customer Relationship] )) AS Currency, -- 对UOM做同样处理,替换NULL为分组内的有效UOM COALESCE(UOM, MAX(UOM) OVER ( PARTITION BY Year, Period, [Year-Period], Region, [Op Co], PMC, [PMC Description], [Customer Relationship] )) AS UOM, [Value Type], Value, [Customer Relationship] FROM gdw.FactBudgetSummaryNew ) SELECT Year, Period, [Year-Period], Region, OpCo, PMC, PMCDescription, Currency, UOM, MAX(CASE WHEN [Value Type] = 'Net Revenue' THEN Value END) AS NetRevenue, MAX(CASE WHEN [Value Type] = 'Sales Volume' THEN Value END) AS SalesVolume, MAX(CASE WHEN [Value Type] = 'Std Gross Margin' THEN Value END) AS StdGrossMargin, CustomerRelationship FROM CleanedData GROUP BY Year, Period, [Year-Period], Region, OpCo, PMC, PMCDescription, Currency, UOM, CustomerRelationship;
关键逻辑解释
- CTE清洗数据:
- 用
MAX(Currency) OVER (PARTITION BY ...)窗口函数,在Year、Period、Region等核心维度分组内,找到该组的非NULL Currency值(因为你提到只有SalesVolume的Currency是NULL,其他Value Type都有有效值,MAX会自动忽略NULL拿到正确值)。 - 用
COALESCE把当前行的NULL Currency替换成这个有效值,UOM的处理逻辑完全一致。
- 用
- 聚合透视:
清洗后的数据里,SalesVolume行的Currency/UOM已经和同组的其他Value Type保持一致,再执行原来的分组聚合,就能得到合并后的单行记录,不会再出现NULL导致的拆分。
如果你的数据中存在某个核心分组里所有Currency都是NULL的极端情况,这个逻辑也会保留NULL(因为MAX(NULL)还是NULL),不会影响其他正常分组。
内容的提问来源于stack exchange,提问作者S. Perry
相关产品推荐
相关产品推荐

