1.条件统计数据
问题描述:创建临时数据表时,设定一列进行区分,后续统计时想加上这个条件,尝试了case when 不太可行,经查询,发现可以使用if条件。
解决方法:例如
count(if(a.y='2022' and a.leixing='对外付款',TRUE,NULL)) as 2022对外付款承兑交易笔数,
sum(if( a.y='2022' and a.leixing='对外付款',a.amount,0)) as 2022对外付款承兑交易金额
问题就解决了。
但是不知道为什么这个可以:
sum(case when d.REL_PARENT_ORG_NAME like '%qw%' then A.AMT else 0 end) as qw代发金额,
sum(case when d.REL_PARENT_ORG_NAME like '%qw%' then 0 else A.AMT end) as 非qw代发金额,
COUNT(case when d.REL_PARENT_ORG_NAME like '%qw%' then 1 else null end) as qw代发笔数,
COUNT(case when d.REL_PARENT_ORG_NAME like '%qw%' then null else 1 end) as 非qw代发笔数
2.Sql报错:不合规的数据
问题描述:在建好临时表后,运行过程中发现sql报错,存在不合规的数据,在查询错误的过程中,先排除正确的数据项,找到出现问题的一列,在通过排序来确认是否这一列数据存在不合规情况。(排序可以 order by 4 desc 这里的4指列表第几列),发现果然数值列中存在字符或者NULL不能满足后续操作。
解决方法:限制这里一列取到的数据必须为数值:
ascii(a.RECP_amount) between 48 and 57
3.Group by的替代方案,parttion by
sum(代发金额)over(partition by 商户号) as 累计代发金额
4.Rownumber函数取已经分组的数据中每组数据的前几个
例如:
先在数据表中加上row_num这一列
row_number() over(partition by 商户号 order by 代发笔数 desc) as rownum
然后嵌套一层,删选条件如下:
where q.rownum<2
即可取出每个组中的每个商户号下最大代发笔数的一条数据。
5.判断条件:某个数据项不在某个表以内
where a.RECV_PSN_ACCT_ID not in (select 字段项 from 表)