我正在使用以零值注册一次,然后再附加一定金额的电子邮件地址。我可以使用case语句进行不同的电子邮件查询,但是我遇到的困难是,如果电子邮件的总金额为零,则在表的其余部分搜索该电子邮件,并使其值> 0,并将该电子邮件地址设为不同。
有什么建议吗?
样本数据: 具有两个字段的表-电子邮件和总金额
Email: abc@gmail.com | Gross Amt: $0
Email: abc@gmail.com | Gross Amt: $50
Email: xyz@gmail.com | Gross Amt: $0
所需的输出:
Email with 0 value: xyz@gmail.com
Email with >0 value: abc@gmail.com
答案 0 :(得分:1)
尝试以下操作-使用汇总和分组依据
Buffer
答案 1 :(得分:0)
您可以尝试使用条件聚合
config.local.php
答案 2 :(得分:0)
那就是挑战。仅需要将0值的电子邮件发送一次,但是如果它具有两个以上的值且一个为0,则丢弃0并考虑值> 0。
可能正在创建两个表,一个表为0,一个表为> 0,然后加入电子邮件地址?从表1中选择电子邮件和总金额1,如果从表1中选择总金额1 = 0,那么从表2中选择总金额= 2?
答案 3 :(得分:0)
您也可以尝试使用row_number()。
select email, grossamt from (select email, grossamt, row_number() over (partition email order by grossamt desc) as rnk from table) A where a.rnk=1
答案 4 :(得分:0)
您可以使用分析功能来做到这一点。请阅读查询中的注释:
select case when emailGrossAmt=0 then 'Email with 0 value'
when emailGrossAmt>0 then 'Email with > 0 value'
end as grp,
email,
GrossAMT
from
(
select s.*,
case when emailGrossAmt=0 then row_number() over(partition by email) else 1 end zero_rn --we need only one record with zeroAMT
from
(
select email, GrossAMT,
sum(GrossAmt) over(partition by email) emailGrossAmt,
dense_rank() over(partition by email order by case when GrossAmt=0 then 1 else 0 end) rnk --to pass all >0, they will have rnk=1
from
( --replace this subquery(s) with your table
select stack(5,
'abc@gmail.com',0 ,
'abc@gmail.com',50 ,
'abc@gmail.com',500 ,
'xyz@gmail.com',0,
'xyz@gmail.com',0 ) as (email, GrossAMT)
) s --your table
) s
where rnk=1
)s where zero_rn=1
结果:
Email with > 0 value abc@gmail.com 500
Email with > 0 value abc@gmail.com 50
Email with 0 value xyz@gmail.com 0
除具有0数量的记录外,将返回所有emailGrossAmt> 0的行。 每封电子邮件中只有一封记录,其中emailGrossAmt = 0,返回了
也许它仍然可以优化,但是希望,你明白了