求和不同的值

时间:2021-03-22 16:15:16

标签: snowflake-cloud-data-platform

我有这个代码,我只想对“TARGET_QUIKPLANSur.PLAN”表中的不同值求和。但我不知道我做错了什么。

SELECT Distinct TARGET_QUIKPLANSur.PLAN, TARGET_QUIKPLANSur.FORM, Sum(TARGET_NEWQUIKVALFSurDec.MANNLZD) AS PREMIUM

from TARGET_QUIKPLANSur Left JOIN TARGET_NEWQUIKVALFSurDec ON TARGET_QUIKPLANSur.PLAN=TARGET_NEWQUIKVALFSurDec.NPLAN

GROUP BY TARGET_QUIKPLANSur.FORM, TARGET_QUIKPLANSur.PLAN

HAVING(((TARGET_QUIKPLANSur.FORM)='LN-5350') and TARGET_QUIKPLANSur.PLAN = 'N06000')

2 个答案:

答案 0 :(得分:1)

这个怎么样?

SELECT PLAN, FORM, SUM(MANNLZD) FROM
(SELECT Distinct TARGET_QUIKPLANSur.PLAN, TARGET_QUIKPLANSur.FORM, TARGET_NEWQUIKVALFSurDec.MANNLZD AS PREMIUM
from TARGET_QUIKPLANSur Left JOIN TARGET_NEWQUIKVALFSurDec ON ARGET_QUIKPLANSur.PLAN=TARGET_NEWQUIKVALFSurDec.NPLAN )
GROUP BY FORM, PLAN
HAVING((FORM='LN-5350') and PLAN = 'N06000')

在分组前过滤会更好:

SELECT PLAN, FORM, SUM(MANNLZD) FROM
(SELECT Distinct TARGET_QUIKPLANSur.PLAN, TARGET_QUIKPLANSur.FORM, TARGET_NEWQUIKVALFSurDec.MANNLZD AS PREMIUM
from TARGET_QUIKPLANSur Left JOIN TARGET_NEWQUIKVALFSurDec ON ARGET_QUIKPLANSur.PLAN=TARGET_NEWQUIKVALFSurDec.NPLAN 
WHERE FORM='LN-5350' and PLAN = 'N06000')
GROUP BY FORM, PLAN;

答案 1 :(得分:1)

我们对您的 SQL 进行了格式化,使其更具可读性:

SELECT DISTINCT q.plan
    ,q.form
    ,SUM(n.mannlzd) AS premium
FROM target_quikplansur AS q
LEFT JOIN target_newquikvalfsurdec AS n
    ON q.plan = n.nplan
GROUP BY q.form, q.plan
HAVING q.form='LN-5350' and q.plan = 'N06000'

猜一猜

<块引用>

我只想对“TARGET_QUIKPLANSur.PLAN”表中的不同值求和”

的意思是,您可能在 TARGET_QUIKPLANSur 中有很多行,而您只希望它们加入一次 target_newquikvalfsurdec 表,因此目前如果您在 target_newquikvalfsurdec 中有两行值为 10,则您希望将 20 作为您回答,但如果您在 TARGET_QUIKPLANSur 中有 2 个以上的重复行,您会得到类似 40

的结果

在这种情况下,您应该在加入 TARGET_QUIKPLANSur 值之前对其进行重复数据删除

SELECT q.plan
    ,q.form
    ,SUM(n.mannlzd) AS premium
FOM (
    SELECT DISTINCT plan, form
    FROM target_quikplansur
) AS q
LEFT JOIN target_newquikvalfsurdec AS n
    ON q.plan = n.nplan
WHERE q.form='LN-5350' and q.plan = 'N06000'

你的问题的另一种方式:

<块引用>

我只想对“TARGET_QUIKPLANSur.PLAN”表中的不同值求和”

可以读取,您是否有一些重复的行,而您只想要没有重复的行。因此对于数据

form         plan      
'LN-5350',   'N06000'
'LN-5350',   'N06000'
'LN-5350',   'N06001'
'LN-5350',   'N06002'

您只需要“N06001”和“N06002”行,因为它们没有重复项。我怀疑这不是您想要的,但如果是,您将使用 COUNT 行,并使用 HAVING 进行过滤。

SELECT q.plan
    ,q.form
    ,SUM(n.mannlzd) AS premium
FOM (
    SELECT plan, form
    FROM target_quikplansur
    GROUP BY 1,2
    HAVING COUNT(*) = 1
) AS q
LEFT JOIN target_newquikvalfsurdec AS n
    ON q.plan = n.nplan
WHERE q.form='LN-5350' and q.plan = 'N06000'

或者另一种看待它的方式是,您希望第一行基于某个其他值,因此:

form         plan      other
'LN-5350',   'N06000'  1
'LN-5350',   'N06000'  2
'LN-5350',   'N06001'  1
'LN-5350',   'N06002'  1

您可能需要最高的其他值,因此使用 QUALIFY 和 ROW_NUMBER 您可以过滤值

SELECT q.plan
    ,q.form
    ,SUM(n.mannlzd) AS premium
FOM (
    SELECT plan, form
    FROM target_quikplansur
    QUALIFY ROW_NUMBER() OVER (PARTITION BY plan, form ORDER BY other DESC) = 1
) AS q
LEFT JOIN target_newquikvalfsurdec AS n
    ON q.plan = n.nplan
WHERE q.form='LN-5350' and q.plan = 'N06000'

限制为这些行:

'LN-5350',   'N06000'  2
'LN-5350',   'N06001'  1
'LN-5350',   'N06002'  1
相关问题