sql - 尝试根据第三列中的值从两列之一返回总和(分组依据)结果
问题描述
我在 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)。
解决方案
您可以使用子查询来定义别名:
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;
推荐阅读
- firebase - 无法从 Firestore 检索数据
- html - 如果字体是粗体和更小,为什么渐变背景在 Firefox 中不起作用
- vsperfmon - Visual Studio 2019 中缺少 vsperf.exe
- javascript - 如何引导一个使用 ivy 进行路由的 Angular 应用程序?
- javascript - 有没有办法可以将 Text 组件的全部内容包装在 react-native 中的父视图中?
- polymer - 聚合物 3.x 中聚合物 1.x 的“行为”对应物是什么
- hyperledger-fabric - 如何在节点链码中使用 stub.getTransient()
- python - 如何在python中配对两个元组?
- charts - 如何在谷歌饼图下写文字
- flutter - Flutter中垂直展开ListView