首页 > 解决方案 > 在 DB2 中使用不同的 group by 语句

问题描述

我有一个成功的查询,它为用户和类别返回一些数据(查询按类别和用户分组),基本上显示每个用户每个类别的预测

select 
    user, 
    category, 
    sum(CatProjection) as CatProjection, 
    sum(CatProjection)/52 as WeekCatProjection
from projections
where user = 123
group by user, category

这将返回我想要/期望的内容:

USER  |   CATEGORY      |   CatProjection |  WeekCatProjection   
----------------------------------------------------------------
123   |   CategoryA     |   755000        |   14519              
123   |   CategoryB     |   390000        |   7500              
123   |   CategoryC     |   281250        |   5408              

问题是,这些结果按用户和类别分组,现在我想添加两列,这取决于该用户的 CatProjection 总和,但不按类别分组。

因此,对于新值 TotalCatProjection,我想为该用户添加所有 CatProjection 值。然后我想使用 CatPercentage 将 WeekCatProjection 除以 TotalCatProjection。

所以现在我期待这些结果:

USER  |   CATEGORY      |   CatProjection |  WeekCatProjection   |  TotalCatProjection |  CatPercentage 
--------------------------------------------------------------------------------------------------------
123   |   CategoryA     |   755000        |   14519              |  27427              |    52.94
123   |   CategoryB     |   390000        |   7500               |  27427              |    27.35
123   |   CategoryC     |   281250        |   5408               |  27427              |    19.72

当我的主要查询按用户和类别分组时,如何获得这 2 个仅基于 USER 的新列?

标签: sqldb2db2-400

解决方案


由于在DB2 7.3中引入了窗口函数,因此您应该使用子查询解决方案:

select user, 
    category, 
    CatProjection, 
    WeekCatProjection,
    TotalCatProjection,
    100 * WeekCatProjection / TotalCatProjection
from
(
    select 
        user, 
        category, 
        sum(CatProjection) as CatProjection, 
        sum(CatProjection)/52 as WeekCatProjection,
        ( 
           select sum(CatProjection) 
           from projections p2
           where p1.user = p2.user
        ) as TotalCatProjection
    from projections p1
    group by user, category 
) t

我避免了这种where user = XYZ情况,因为GROUP BY user那样没有意义,但是,如果你愿意,你可以将它插入那里。


推荐阅读