Sql 选择案例语句添加信息

Sql 选择案例语句添加信息,sql,sum,db2,Sql,Sum,Db2,我有两张表,cardinfo和paytb。在我的声明中,我加入了他们的行列 select (case when age_years >= 18 and age_years < 30 then '18-29' when age_years < 50 then '30-49' when age_years < 70 then '50-69' when age_years < 100 then '

我有两张表,cardinfo和paytb。在我的声明中,我加入了他们的行列

 select (case when age_years >= 18 and age_years < 30 then '18-29'
            when age_years < 50 then '30-49'
            when age_years < 70 then '50-69'
             when age_years < 100 then '70-100'
            end) as age_range,
             count(DISTINCT c.CONT_ID) as num,
     CASE WHEN GENDER = '1' THEN 1 ELSE 0 END / COUNT(DISTINCT c.CONT_ID),
     SUM(ACAUREQ_AUREQ_TX_DT_TTLAMT) / COUNT(*) 'TOTAL-Amount Avg' 
         from cardinfo c
         left join paytb t
          on c.CONT_ID = t.CONT_ID
      group by (case when age_years >= 18 and age_years < 30 then '18-29'
         when age_years < 50 then '30-49'
         when age_years < 70 then '50-69'
         when age_years < 100 then '70-100'
         end)
         order by min(age_years);       
我想从表中添加性别参数0或1。但是,这不起作用:

CASE WHEN GENDER = '1' THEN 1 ELSE 0 END / COUNT(DISTINCT c.CONT_ID)  
sqlcode=-122

我试图找到交易的平均值:

SUM(ACAUREQ_AUREQ_TX_DT_TTLAMT) / COUNT(*) 'TOTAL-Amount Avg' 
不幸的是,这将给我一个DECFLOAT错误。 总数如下所示:

  SUM(ACAUREQ_AUREQ_TX_DT_TTLAMT)
    -----+---------+---------+---------+
    +1.232071426000000000000000E+0007   
    +3.062581021000000000000000E+0007   
    +2.399951792000000000000000E+0007   
    +8.228919170000000000000000E+0006   

您需要将性别包含在group by中,或者将其作为聚合函数的参数:

SUM(CASE WHEN GENDER = '1' THEN 1 ELSE 0 END) / COUNT(DISTINCT c.CONT_ID)
但是,您可能不需要COUNTDISTINCT。如果没有必要,您可以将其简化为:

AVG(CASE WHEN GENDER = '1' THEN 1.0 ELSE 0 END)

我将原始查询包装在一个派生表中,以保存一些键入:

select age_range,
       count(DISTINCT CONT_ID) as num,
       CASE WHEN GENDER = '1' THEN 1 ELSE 0 END / COUNT(DISTINCT c.CONT_ID),
       SUM(ACAUREQ_AUREQ_TX_DT_TTLAMT) / COUNT(*) 'TOTAL-Amount Avg' 
from
(
    select (case when age_years >= 18 and age_years < 30 then '18-29'
                 when age_years < 50 then '30-49'
                 when age_years < 70 then '50-69'
                 when age_years < 100 then '70-100'
            end) as age_range,
            c.CONT_ID,
            GENDER,
            ACAUREQ_AUREQ_TX_DT_TTLAMT
    from CARDUSR.CLIENT_INFO c
    left join cardusr.sppaytb t
        on c.CONT_ID = t.CONT_ID
)
group by age_range, GENDER

如果成功了,我将不得不添加更多的专栏。就像最常见的ACAUREQ_AUREQ_ENV_M_CMONNM一样——常见的商户名称。那会是什么样子?@bastel。我不知道你想要什么但SUMCASE。和AVGCASE。是一种常见的构造。
select age_range,
       count(DISTINCT CONT_ID) as num,
       CASE WHEN GENDER = '1' THEN 1 ELSE 0 END / COUNT(DISTINCT c.CONT_ID),
       SUM(ACAUREQ_AUREQ_TX_DT_TTLAMT) / COUNT(*) 'TOTAL-Amount Avg' 
from
(
    select (case when age_years >= 18 and age_years < 30 then '18-29'
                 when age_years < 50 then '30-49'
                 when age_years < 70 then '50-69'
                 when age_years < 100 then '70-100'
            end) as age_range,
            c.CONT_ID,
            GENDER,
            ACAUREQ_AUREQ_TX_DT_TTLAMT
    from CARDUSR.CLIENT_INFO c
    left join cardusr.sppaytb t
        on c.CONT_ID = t.CONT_ID
)
group by age_range, GENDER