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 byempID
),group bymanagerID
,创建一个销售总额,然后是总额(但我想在这里仅根据过去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 |