Snowflake cloud data platform 嗨,我有一个缺少标准的代码

Snowflake cloud data platform 嗨,我有一个缺少标准的代码,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,[![First output][1]][1] [![Second output][2]][2] [![组合输出][3]][3] [![组合脚本][4]][4] 我有这个代码,但R LN-5360中的标准不存在。但是,S中的标准确实存在,其总和值为“30”。但是,当我加入这两个查询时,它会将MonthlyPremium作为“0”而不是“30”。有人能告诉我我做错了什么吗?我无法删除R,因为我有更多现有条件 选择S.Newf、zeroifnullRoundPR+PRE作为MonthlyPremiu

[![First output][1]][1]

[![Second output][2]][2]

[![组合输出][3]][3]

[![组合脚本][4]][4]

我有这个代码,但R LN-5360中的标准不存在。但是,S中的标准确实存在,其总和值为“30”。但是,当我加入这两个查询时,它会将MonthlyPremium作为“0”而不是“30”。有人能告诉我我做错了什么吗?我无法删除R,因为我有更多现有条件

选择S.Newf、zeroifnullRoundPR+PRE作为MonthlyPremium 从…起 选择TARGET_QUIKPLANSurv.FORM,如果nulltarget_newquikvalfsuredec.MVALDATE,'2020-12-31'作为报告日期,SUMTARGET_newquikvalfsuredec.MANNLZD/12作为PR 从TARGET_QUIKPLANSurv向左连接TARGET_NEWQUIKVALFSurDec ON TARGET_QUIKPLANSurv.PLAN=TARGET_NEWQUIKVALFSurDec.NPLAN 按TARGET_QUIKPLANSurv.FORM、TARGET_newquikvalfsuredec.MVALDATE分组 有目标_quikplan surv.FORM='LN-5360' as R 右连接 选择TARGET_QUIKPLAN.FORMS,如果nulltarget_NEWQUIKVALF1.MVALDATE,“2020-12-31”作为报告日期,SUMTARGET_NEWQUIKVALF1.MANNLZD/12作为预, 如果TARGET_QUIKPLAN.FORMS='L-5360','LN-5360',TARGET_QUIKPLAN.FORMS为Newf 从TARGET\u QUIKPLAN左侧加入TARGET\u QUIKPLAN.PLAN=TARGET\u NEWQUIKVALF1.NPLAN上的TARGET\u NEWQUIKVALF1 按TARGET_QUIKPLAN.FORMS、TARGET_NEWQUIKVALF1.MVALDATE分组 有目标计划。形式='L-5360' 作为R.FORM上的S=S.Newf [1]: https://i.stack.imgur.com/2L0MO.png [2]: https://i.stack.imgur.com/VkPca.png [3]: https://i.stack.imgur.com/MO1uX.png [4]: https://i.stack.imgur.com/LFJYS.png
当你注意到边上有一个30的S值,并且你在做右连接,你就有一行了。是时候了解您正在使用的不同操作是如何工作的了,因此0从何而来:

SELECT pr
    ,pre
    ,pr + pre AS a
    ,round(a) AS ra
    ,ZEROIFNULL(ra) as monthlypremium
FROM VALUES 
    (0,30),   
    (null,30),
    (0,null),
    (null,null)
    v(pr,pre);
    
这是4行数据,结果有不同的排列,最后一行不会发生

PR      PRE     A       RA      MONTHLYPREMIUM
0       30      30      30      30
null    30      null    null    0
0       null    null    null    0
null    null    null    null    0
这告诉我们带null的加法为null,因此需要将ZEROIFNULL移到加法的前面。因此,你想要:

ROUND(ZEROIFNULL(pr) + ZEROIFNULL(pre)) AS monthlypremium
作为补充说明,将SQL select放在新行上可以更容易地在StackOverflow上读取,并且为表使用别名可以加快读取速度,并且给定列的大小写并不重要,保留单词和列大小写不同也有助于理解。我也倾向于缩进和跟随WHERE子句,这样你就可以把东西包装到新的行上,以保持阅读宽度不太宽,这是最后一段逻辑

因此,我将编写您的SQL for style:

select s.newf
    ,ROUND(ZEROIFNULL(pr) + ZEROIFNULL(pre)) AS monthlypremium
FROM (  
    SELECT q.form
        ,IFNULL(n.mvaldate, '2020-12-31') AS reportdate 
        ,SUM(n.mannlzd)/12 AS pr
    FROM target_quikplansurv AS q
    LEFT JOIN target_newquikvalfsurdec AS n
        ON q.plan = n.nplan
    GROUP BY q.form, n.mvaldate
    HAVING q.form='LN-5360'              
) AS r
RIGHT JOIN ( 
    SELECT q.forms
        ,ifnull(n.mvaldate, '2020-12-31') AS reportdate
        ,SUM(n.mannlzd)/12 AS pre
        ,iff(q.forms = 'L-5360', 'LN-5360', q.forms ) AS newf   
    FROM target_quikplan AS q
    LEFT JOIN target_newquikvalf1 AS n
        ON q.plan = n.nplan
    GROUP BY q.forms, n.mvaldate
    HAVING q.forms = 'L-5360'    
) AS s 
    ON r.form = s.newf 
最后,SQL正在做什么

    SELECT q.form
        ,IFNULL(n.mvaldate, '2020-12-31') AS reportdate 
        ,SUM(n.mannlzd)/12 AS pr
    FROM target_quikplansurv AS q
    LEFT JOIN target_newquikvalfsurdec AS n
        ON q.plan = n.nplan
    GROUP BY q.form, n.mvaldate
    HAVING q.form='LN-5360'
在这里,您是按原始源表mvaldate分组的,但是您正在转换为select中的默认值“2020-12-31”,因此您指出mvaldate可以为空,但按原始输入表上的组分组

FORM,       mvaldate,     mannlzd
'LN-5360',  '2020-11-30', 120
'LN-5360',  '2020-12-31', 240
'LN-5360',  null,         360
将给出输出:

'LN-5360',  '2020-11-30', 10
'LN-5360',  '2020-12-31', 20
'LN-5360',  '2020-12-31', 30
因为第三行NULL与第二行“2020-12-31”不同。也许你想要。但我怀疑这会让人们感到困惑

但是,通过having子句,所有聚合都将发生。如果有1000万行的表单与'LN-3560'不同,那么这些值都将被计算并丢弃,这意味着您应该交换到WHERE子句,因为您可能能够避免由于微分区而读取数据并避免聚合

这让我觉得您真的希望SQL看起来像:

SELECT s.newf
    ,ROUND(ZEROIFNULL(pr) + ZEROIFNULL(pre)) AS monthlypremium
FROM (  
    SELECT q.form
        ,IFNULL(n.mvaldate, '2020-12-31') AS reportdate 
        ,SUM(n.mannlzd)/12 AS pr
    FROM target_quikplansurv AS q
    LEFT JOIN target_newquikvalfsurdec AS n
        ON q.plan = n.nplan
    WHERE q.form='LN-5360'   
    GROUP BY 1,2   
) AS r
RIGHT JOIN ( 
    SELECT q.forms
        ,ifnull(n.mvaldate, '2020-12-31') AS reportdate
        ,SUM(n.mannlzd)/12 AS pre
        ,iff(q.forms = 'L-5360', 'LN-5360', q.forms ) AS newf   
    FROM target_quikplan AS q
    LEFT JOIN target_newquikvalf1 AS n
        ON q.plan = n.nplan
    WHERE q.forms = 'L-5360'
    GROUP BY 1,2
) AS s 
    ON r.form = s.newf 
但考虑到您编写的代码,它也可能是:

SELECT s.newf
    ,ROUND(ZEROIFNULL(pr) + ZEROIFNULL(pre)) AS monthlypremium
FROM (  
    SELECT q.form
        ,IFNULL(n.mvaldate, '2020-12-31') AS reportdate 
        ,SUM(n.mannlzd)/12 AS pr
    FROM target_quikplansurv AS q
    LEFT JOIN target_newquikvalfsurdec AS n
        ON q.plan = n.nplan
    WHERE q.form='LN-5360'   
    GROUP BY 1,2          
) AS r
RIGHT JOIN ( 
    SELECT q.forms
        ,IFNULL(n.mvaldate, '2020-12-31') AS reportdate
        ,SUM(n.mannlzd)/12 AS pre
        ,'LN-5360' AS newf   
    FROM target_quikplan AS q
    LEFT JOIN target_newquikvalf1 AS n
        ON q.plan = n.nplan
    WHERE q.forms = 'L-5360'
    GROUP BY 1,2     
) AS s 
    ON r.form = s.newf 

同样,您可以发布一些示例数据和预期输出。您编写的SQL看起来是错误的,但您可能是正确的,因为您的数据是疯狂的。但是没有样本数据真的很难帮上忙。我投票决定结束这个问题。我们很乐意帮助你@Dgbow,但是没有足够的信息可以复制。我只是在另一篇文章上上传了完整的数据。我也在这篇文章中分享了数据