我正在提取一个表,但我也想要一个列的和。
我可以说SUM(column) over (partition by other_column)
对于other_column
给出的每个组,得到column
上的和的新列。
但是我不想分组!基本上,sum(column)
意味着给我一个具有恒定行的列,等于整个column
的和,没有分区。
那么如何在零上进行分区呢?
就像你说的那样;在"nothing"例如:
SQL> select deptno, ename, sal, sum(sal) over () sumsal
2 from emp;
DEPTNO ENAME SAL SUMSAL
---------- ---------- ---------- ----------
20 SMITH 920 34145
30 ALLEN 1600 34145
30 WARD 1250 34145
20 JONES 2975 34145
30 MARTIN 1250 34145
30 BLAKE 2850 34145
10 CLARK 2450 34145
20 SCOTT 3000 34145
10 KING 10000 34145
30 TURNER 1500 34145
20 ADAMS 1100 34145
30 JAMES 950 34145
20 FORD 3000 34145
10 MILLER 1300 34145
14 rows selected.
SQL>
让我们看看表orders
创建如下:
CREATE TABLE orders (
`trade_date` DATETIME,
`ticker` VARCHAR(4),
`trans_type` VARCHAR(4),
`quantity` INTEGER
);
INSERT INTO orders
(`trade_date`, `ticker`, `trans_type`, `quantity`)
VALUES
('2020-12-10', 'FB', 'BUY', '100'),
('2020-12-28', 'FB', 'BUY', '50'),
('2020-12-29', 'FB', 'SELL', '80'),
('2020-12-30', 'FB', 'SELL', '30'),
('2020-12-31', 'FB', 'BUY', '40'),
('2020-11-16', 'AAPL', 'BUY', '30'),
('2020-11-17', 'AAPL', 'SELL', '70'),
('2020-11-20', 'AAPL', 'BUY', '50'),
('2020-11-24', 'AAPL', 'BUY', '40');
我们想用trans_type
对quantity
求和:
查询# 1
SELECT
trade_date,
ticker,
trans_type,
quantity,
SUM(CASE WHEN trans_type='SELL' THEN -quantity ELSE quantity END) OVER () AS net_quantity
FROM
orders;
我们将得到这张表:
ticker | trans_type | quantity | net_quantity | 2020-12-10就是 | FB | 买 | 100 | 130 |
---|---|---|---|---|
2020-12-28就是 | FB | 买 | 50 | 130 |
2020-12-29就是 | FB | 销售 | 80 | 130 |
2020-12-30就是 | FB | 销售 | 30 | 130 |
2020-12-31就是 | FB | 买 | 40 | 130 |
2020-11-16就是 | apple | 买 | 30 | 130 |
2020-11-17就是 | apple | 销售 | 70 | 130 |
2020-11-20就是 | apple | 买 | 50 | 130 |
2020-11-24就是 | apple | 买 | 40 | 130 |