簡體   English   中英

Pivot 在 Azure DW(突觸)中使用 Max

[英]Pivot using Max in Azure DW(Synapse)

我在 azure sql dw 中遇到了 pivot 的一個奇怪問題。 我在暫存表中有 2 行,如下所示

Select Flag, Number,Value,Interest from stg.tableA where Number = 400799074  

Flag        Number       Value    Interest
Federal     0400799074  12540.8    0
Provincial  0400799074  248.97    -0.01

對 pivot 的查詢並填充我的目標表如下

SELECT
Number
,MAX(CASE WHEN Flag = 'Federal' THEN ISNULL(stg.[Value], 0) ELSE 0  END) AS  [FederalValue]
,MAX(CASE WHEN Flag = 'Provincial' THEN ISNULL(stg.[Value], 0) ELSE 0  END) AS [ProvincialValue]
,MAX(CASE WHEN Flag = 'Federal'  THEN ISNULL(stg.[Interest], 0) ELSE 0  END) AS [FederalInterest]
,MAX(CASE WHEN Flag = 'Provincial' THEN ISNULL(stg.[Interest], 0) ELSE 0 END) AS [ProvincialInterest]
FROM
[stg].[TableA]   stg
where LoanNumber = 400799074  
GROUP BY 
stg.Number

我得到的 output 是

Number      FederalValue    ProvincialValue   FederalIntrest    ProvincialInterest 
400799074    12540.8         248.97             0                   0

我遺漏了一些東西,因為我不明白為什么是 ProvincialInterest 0 而不是 -0.01

stg 表中的數據類型是浮點數,目標表是十進制(15,2)。

當我刪除 else 條件時,我得到了正確的結果,我無法刪除它們,因為會有“省”行不存在的情況。

,MAX(CASE WHEN Flag = 'Provincial' THEN ISNULL(stg.[Interest], 0) /*ELSE 0  removed */ END) AS [ProvincialInterest]

快速樣本數據

declare @tableA table
(
    Flag nvarchar(20),
    Number nvarchar(20),
    Value money,
    Interest money
);

insert into @tableA (Flag, Number, Value, Interest) values
('Federal', '0400799074', 12540.80, 0.0),
('Provincial', '0400799074', 248.97, -0.01),
('Federal', '0423456789', 123.45,  10.0); --Number without Provincial level

快速而骯臟的解決方案

在獲取包含負值的數據集的最大值時,不應將未知 ( null ) 值替換為 0( ISNULL(..., 0)部分)。 相反,您應該使用該數據類型的最小值。 這里我只是用-99999來證明'大負值'點。

select  Number
        ,MAX(CASE WHEN Flag = 'Federal'    THEN ISNULL(stg.[Value],    0) ELSE -99999 END) AS [FederalValue]
        ,MAX(CASE WHEN Flag = 'Provincial' THEN ISNULL(stg.[Value],    0) ELSE -99999 END) AS [ProvincialValue]
        ,MAX(CASE WHEN Flag = 'Federal'    THEN ISNULL(stg.[Interest], 0) ELSE -99999 END) AS [FederalInterest]
        ,MAX(CASE WHEN Flag = 'Provincial' THEN ISNULL(stg.[Interest], 0) ELSE -99999 END) AS [ProvincialInterest]
FROM @tableA stg
group by stg.Number;

此查詢具有所需的-0.01的結果,但還包含仍必須處理的替換值-99999.00以獲得請求的結果。

更好的解決方案

如果您不知道數據值的全部范圍,則可能很難確定合適的負替換值(例如-99999 )。 因此,我建議讓MAX() function 處理未知數( NULL )。 提示:function 會忽略它們...最后一步替換任何NULL值。 這意味着將ISNULL() function 移到MAX() function 之外。

select  Number
        ,ISNULL(MAX(CASE WHEN Flag = 'Federal'    THEN stg.[Value]    END), 0) AS [FederalValue]
        ,ISNULL(MAX(CASE WHEN Flag = 'Provincial' THEN stg.[Value]    END), 0) AS [ProvincialValue]
        ,ISNULL(MAX(CASE WHEN Flag = 'Federal'    THEN stg.[Interest] END), 0) AS [FederalInterest]
        ,ISNULL(MAX(CASE WHEN Flag = 'Provincial' THEN stg.[Interest] END), 0) AS [ProvincialInterest]
from @tableA stg
group by stg.Number;

樣本結果

更好的解決方案的結果。

Number               FederalValue          ProvincialValue       FederalInterest       ProvincialInterest
-------------------- --------------------- --------------------- --------------------- ---------------------
0400799074           12540,80              248,97                0,00                  -0,01
0423456789           123,45                0,00                  10,00                 0,00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM