基于对计算列进行分组的db2查询

时间:2019-01-24 20:34:20

标签: sql db2

我有一个查询,它可以返回基本结果,但是在尝试根据不同分组选择其他列/变量时遇到了问题。

查询的基础是:

SELECT
 EmpID,
 managerID,
 Group,
 quant as sales,
from products p
where active_date > CURRENT_DATE - 50 days;

问题是,这些记录使用了50天,但是我想根据过去25天内的条件选择3个新的计算作为列。

说我现在回来了:

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分组(salesempID分组),managerID分组来创建销售总额,然后是总计(但我想将最近25天的记录分组为基础)

关于我的预期输出的想法(假设前50天的所有记录也是最近25天):

empId  |  managerID  |  group  |  sales  | salesEmpID  |  salesMngID  |  SalesTotal
====================================================================================
123          1            A        4           4             14             39
321          1            A        2           2             14             39
516          1            A        8           8             14             39
345          2            A        4           4             13             39
839          2            A        7           7             13             39
849          2            A        2           2             13             39
192          3            A        9           9              9             39
221          4            A        3           3              3             39

所以对于产品组A,这不仅给我每个员工销售,而且还给那个销售经理,然后是总销售,所有这些都给产品组A

如何获得类似的信息,并且即使查询是最近50天,也要确保数量总和基于最近25天?

2 个答案:

答案 0 :(得分:1)

在寻找条件窗口函数时?

var inputTextField: UITextField?
var inputTextField2: UITextField?

let alert = UIAlertController(title: "Name?", message: "Can I get a first and last name?", preferredStyle: UIAlertController.Style.alert)
    alert.addAction(UIAlertAction(title:"Enter", style: UIAlertAction.Style.default,handler: { (action) -> Void in
        inputTextField?.autocapitalizationType = .words
        inputTextField2?.autocapitalizationType = .words
        let firstName = self.replaceSingleQuote(str: inputTextField?.text! ?? "")
        let lastName = self.replaceSingleQuote(str: inputTextField2?.text! ?? "")
        print("USER ENTERED THIS NAME: \(firstName) \(lastName)")
}

答案 1 :(得分:1)

如果您的RDBMS不支持窗口功能,那么这里的解决方案应该可以工作。

它通过创建一系列联接来计算每个组(员工,经理,总数)的小计而起作用。参见this db fiddle(我不了解DB2提琴,所以我使用了MySQL5.7,但就此而言,它应该适用于DB2):

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         |