我有这个代码,我只想对“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')
答案 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