我有一个查询,它可以返回基本结果,但是在尝试根据不同分组选择其他列/变量时遇到了问题。
查询的基础是:
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
分组(sales
,empID
分组),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天?
答案 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 |