首页 > 解决方案 > 尝试根据第三列中的值从两列之一返回总和(分组依据)结果

问题描述

我在 DB2 (IBM Spectrum Protect) 中有一个表,如果它是普通备份,我试图提取一个在 ENTITY 中具有服务器名称的报告,但如果它是 VM 备份,则将服务器名称放在 SUB_ENTITY 中。我希望能够获得一个完整的列表,将两者的结果结合起来,然后计算 X 天的总体备份量。在执行此操作时,我需要能够从 VM 节点 server_name 中提取客户代码。我目前的解决方案是使用两个不同的选择来提取数据并手动组合数据。

我尝试了一个带有案例的选择,但 group by 正在返回错误。

select -
   varchar(ACTIVITY_DETAILS,20) as ACTIVITY_DETAILS, -
  case -
   when ACTIVITY_DETAILS='VMware' -
    then -
     varchar(sub_entity,47) -
    else -
     VARCHAR(ENTITY,47) -
   end as CUSTOMER_ID, -
sum(bytes)/1024/1024/1024 as TOTAL_GB -
from summary_extended -
 where -
 activity in ('BACKUP') -
 and -
 start_time>=(current_timestamp - 30 days)
group by CUSTOMER_ID

我需要按案例结果分组,但不能按 CUSTOMER_ID 分组。我得到以下

ANR0162W 补充数据库诊断信息:-1:42S22:-206([IBM][CLI Driver][DB2/AIX64] SQL0206N “CUSTOMER_ID”在使用它的上下文中无效。SQLSTATE=42703)。

标签: sqlselectdb2

解决方案


您可以使用子查询来定义别名:

select varchar(ACTIVITY_DETAILS, 20) as ACTIVITY_DETAILS, 
       customer_id,
       sum(bytes) / (1024*1024*1024) as TOTAL_GB
from (select se.*,
             (case when ACTIVITY_DETAILS = 'VMware'
                   then varchar(sub_entity, 47)
                   else VARCHAR(ENTITY, 47)
              end) as CUSTOMER_ID
      from summary_extended se
     ) se
where activity in ('BACKUP') and
      start_time >= (current_timestamp - 30 days)
group by varchar(ACTIVITY_DETAILS, 20), 
         customer_id;

推荐阅读