You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

关键逻辑解释

  1. CTE清洗数据:
    • 用MAX(Currency) OVER (PARTITION BY ...)窗口函数,在Year、Period、Region等核心维度分组内,找到该组的非NULL Currency值(因为你提到只有SalesVolume的Currency是NULL,其他Value Type都有有效值,MAX会自动忽略NULL拿到正确值)。
    • 用COALESCE把当前行的NULL Currency替换成这个有效值,UOM的处理逻辑完全一致。
  2. 聚合透视:
    清洗后的数据里,SalesVolume行的Currency/UOM已经和同组的其他Value Type保持一致,再执行原来的分组聚合,就能得到合并后的单行记录,不会再出现NULL导致的拆分。

如果你的数据中存在某个核心分组里所有Currency都是NULL的极端情况,这个逻辑也会保留NULL(因为MAX(NULL)还是NULL),不会影响其他正常分组。

内容的提问来源于stack exchange,提问作者S. Perry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:46:41