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作为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.pngSnowflake 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
当你注意到边上有一个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,但是没有足够的信息可以复制。我只是在另一篇文章上上传了完整的数据。我也在这篇文章中分享了数据