Sql 基于计算列分组的db2查询

Sql 基于计算列分组的db2查询,sql,db2,Sql,Db2,我有一个查询,它可以返回基本结果,但我在试图找出如何基于不同分组选择其他列/变量时遇到了一个问题 查询的基础是: SELECT EmpID, managerID, Group, quant as sales, from products p where active_date > CURRENT_DATE - 50 days; 问题是,这些记录是50天的,但我想选择3个新的计算列作为基于过去25天内条件的列 假设我当前返回: empId | managerID | gro

我有一个查询,它可以返回基本结果,但我在试图找出如何基于不同分组选择其他列/变量时遇到了一个问题

查询的基础是:

SELECT
 EmpID,
 managerID,
 Group,
 quant as sales,
from products p
where active_date > CURRENT_DATE - 50 days;
问题是,这些记录是50天的,但我想选择3个新的计算列作为基于过去25天内条件的列

假设我当前返回:

empId  |  managerID  |  group  |  sales
=======================================
123          1            A        4
321          1            B        2
516          1            C        8
345          2            D        4
839          2            E        7
849          2            F        2
192          3            G        9
221          4            H        3
因此,我想根据
empID
(销售总额
sales
,group by
empID
),group by
managerID
,创建一个销售总额,然后是总额(但我想在这里仅根据过去25天的记录进行分组)

我对预期产出的想法(假设之前50天的所有记录也在过去25天内):

所以对于产品组A,这给了我每个员工的销售额,也给了那个销售经理,然后是总销售额,全部都给了产品组A


即使查询是最后50天,我如何才能得到这样的结果,并确保数量的总和基于最后25天?

当您在寻找条件窗口函数时

select EmpID, managerID, Group, quant as sales,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by empId) as emp_25,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by managerId) as manager_25,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by group) as group_25
from products p
where active_date > CURRENT_DATE - 50 days;

当您在寻找条件窗口函数时

select EmpID, managerID, Group, quant as sales,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by empId) as emp_25,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by managerId) as manager_25,
       sum(case when active_date > current_date - 25 days then quant else 0 end) over (partition by group) as group_25
from products p
where active_date > CURRENT_DATE - 50 days;

如果您的RDBMS不支持窗口函数,那么这里有一个解决方案应该可以工作

它通过创建一系列联接来计算每个组(员工、经理、总计)的小计。请参阅(我不知道DB2提琴,所以我使用了MySQL5.7,但考虑到它应该在DB2上工作):

|empID | managerID | groupID | sales | salesEmpID | salesMngID | salesMngID | salesTotal| | ----- | --------- | ------- | ----- | ---------- | ---------- | ---------- | |123 | 1 | A | 4 | 4 | 14 | 39| |321 | 1 | B | 2 | 2 | 14 | 39| |516 | 1 | C | 8 | 8 | 14 | 39| |345 | 2 | D | 4 | 4 | 13 | 39| |839 | 2 | E | 7 | 7 | 13 | 39| |849 | 2 | F | 2 | 2 | 13 | 39| |192 | 3 | G | 9 | 9 | 39| |221 | 4 | H | 3 | 3 | 39|
如果您的RDBMS不支持窗口函数,那么这里有一个解决方案应该可以工作

它通过创建一系列联接来计算每个组(员工、经理、总计)的小计。请参阅(我不知道DB2提琴,所以我使用了MySQL5.7,但考虑到它应该在DB2上工作):

|empID | managerID | groupID | sales | salesEmpID | salesMngID | salesMngID | salesTotal| | ----- | --------- | ------- | ----- | ---------- | ---------- | ---------- | |123 | 1 | A | 4 | 4 | 14 | 39| |321 | 1 | B | 2 | 2 | 14 | 39| |516 | 1 | C | 8 | 8 | 14 | 39| |345 | 2 | D | 4 | 4 | 13 | 39| |839 | 2 | E | 7 | 7 | 13 | 39| |849 | 2 | F | 2 | 2 | 13 | 39| |192 | 3 | G | 9 | 9 | 39| |221 | 4 | H | 3 | 3 | 39|

除了向我们显示当前和预期输出外,还应显示示例输入表数据。仅凭你的描述,我似乎无法反驳你想在这里做什么。我会看看我能想出什么@TimBiegeleisen。我可能混淆了这个问题,但我基本上是基于不同的日期和数量总和执行三个新的子选择/子查询,首先按empID进行分组,然后按mangerID进行分组,然后按mangerID进行分组all@TimBiegeleisen我不确定如何在这里正确显示示例输入表,你是说我的表定义吗?在这个网站上回答SQL问题的大多数人都认为它是一个起点、输入表数据和一些终点,即预期结果集是什么。如果我们看不到这一点,就很难帮助您。除了向我们显示当前和预期的输出外,您还应该显示示例输入表数据。仅凭你的描述,我似乎无法反驳你想在这里做什么。我会看看我能想出什么@TimBiegeleisen。我可能混淆了这个问题,但我基本上是基于不同的日期和数量总和执行三个新的子选择/子查询,首先按empID进行分组,然后按mangerID进行分组,然后按mangerID进行分组all@TimBiegeleisen我不确定如何在这里正确显示示例输入表,你是说我的表定义吗?在这个网站上回答SQL问题的大多数人都认为它是一个起点、输入表数据和一些终点,即预期结果集是什么。如果我们看不到这一点,就很难帮助你。我认为这在逻辑上是有道理的,但出于某种原因,它告诉我(无效。有效的令牌:,从到。我也在语法检查器中运行了该示例,它似乎抛出了一个错误,但不是具体的错误。它看起来像是一个问题,需要对某些用户进行覆盖和分区。)reason@Whisou138:可能是由于名为
group
的列引起的,该列是SQL关键字…您可以尝试
p.group
取而代之。我也试过了,但还是出现了一个错误。它是基于db2版本的吗?我认为这在逻辑上是合理的,但出于某种原因,它告诉我(无效。有效的令牌:,从到。我也在语法检查器中运行了该示例,它似乎抛出了一个错误,但不是具体的错误。它看起来像是一个问题,需要对某些用户进行覆盖和分区。)reason@Whisou138:可能是由于名为
group
的列引起的,该列是SQL关键字…您可以尝试
p.group
相反,我尝试了
SELECT 
    t.empID,
    t.managerID,
    t.groupID,
    t.sales,
    temp.sales salesEmpID,
    tmng.sales salesMngID,
    tall.sales salesTotal
FROM 
    mytable t
    INNER JOIN (
        SELECT empID, SUM(sales) sales 
        FROM mytable 
        WHERE active_date > CURRENT_DATE - INTERVAL 25 DAY 
        GROUP BY empID
    ) temp ON temp.empID = t.empID
    INNER JOIN (
        SELECT managerID, SUM(sales) sales 
        FROM mytable 
        WHERE active_date > CURRENT_DATE - INTERVAL 25 DAY 
        GROUP BY managerID
    ) tmng ON tmng.managerID = t.managerID
    CROSS JOIN (
        SELECT SUM(sales) sales 
        FROM mytable 
        WHERE active_date > CURRENT_DATE - INTERVAL 25 DAY
    ) tall
WHERE t.active_date > CURRENT_DATE - INTERVAL 50 DAY;
| empID | managerID | groupID | sales | salesEmpID | salesMngID | salesTotal | | ----- | --------- | ------- | ----- | ---------- | ---------- | ---------- | | 123 | 1 | A | 4 | 4 | 14 | 39 | | 321 | 1 | B | 2 | 2 | 14 | 39 | | 516 | 1 | C | 8 | 8 | 14 | 39 | | 345 | 2 | D | 4 | 4 | 13 | 39 | | 839 | 2 | E | 7 | 7 | 13 | 39 | | 849 | 2 | F | 2 | 2 | 13 | 39 | | 192 | 3 | G | 9 | 9 | 9 | 39 | | 221 | 4 | H | 3 | 3 | 3 | 39 |