如何在同一列上聚合?
How to aggregate on the same column?
我想弄清楚哪个看起来很简单,但我无法找到一种方法来做同样的事情。
考虑以下 table 和数据,
create table dummy_query
(id varchar2(20), amount number(10,2), memo varchar(20));
insert into dummy_query values('1', 10.00, 'Memo');
insert into dummy_query values('1', 20.00, 'Memo1');
我想获取以下值:
Id MemoValue Memo1Value TotalSum
----------
1 10.00 20.00 30.00
有没有办法通过这种方式获取数据?
谢谢!
我对 PIVOT 不是很熟悉,但是您尝试过的我确实在其上构建了查询。希望这是你需要的 -
SELECT a.*, b.SUM_AMT
FROM ((SELECT ID, amount, memo FROM dummy_query) PIVOT (SUM (amount)
FOR (memo)
IN ('Memo', 'Memo1'))) a,
( SELECT ID, SUM (AMOUNT) "SUM_AMT"
FROM dummy_query
GROUP BY id) b
WHERE a.id = b.id
可以有更好的方法来解决这个问题,所以让我们看看其他人必须分享什么。
Oracle 11g R2 架构设置:
create table dummy_query (id, amount, memo) AS
SELECT '1', 10.00, 'Memo' FROM DUAL
UNION ALL SELECT '1', 20.00, 'Memo1' FROM DUAL
UNION ALL SELECT '1', 30.00, 'Memo2' FROM DUAL;
查询 1:
如果 TotalSum
是所有备忘录金额的总和(而不仅仅是 Memo
和 Memo1
)那么你可以这样做:
SELECT ID,
SUM( CASE memo WHEN 'Memo' THEN amount END ) AS MemoValue,
SUM( CASE memo WHEN 'Memo1' THEN amount END ) AS Memo1Value,
SUM( amount ) AS TotalSum
FROM dummy_query
GROUP BY id
| ID | MEMOVALUE | MEMO1VALUE | TOTALSUM |
|----|-----------|------------|----------|
| 1 | 10 | 20 | 60 |
查询 2:
但是如果 TotalSum
只是 MemoValue + Memo1Value
则添加一个 where 子句:
SELECT ID,
SUM( CASE memo WHEN 'Memo' THEN amount END ) AS MemoValue,
SUM( CASE memo WHEN 'Memo1' THEN amount END ) AS Memo1Value,
SUM( amount ) AS TotalSum
FROM dummy_query
WHERE memo IN ( 'Memo', 'Memo1' )
GROUP BY id
| ID | MEMOVALUE | MEMO1VALUE | TOTALSUM |
|----|-----------|------------|----------|
| 1 | 10 | 20 | 30 |
查询 3:
或者,如果您出于其他原因需要包含所有行,那么您可以这样做:
SELECT ID,
SUM( CASE memo WHEN 'Memo' THEN amount END ) AS MemoValue,
SUM( CASE memo WHEN 'Memo1' THEN amount END ) AS Memo1Value,
SUM( CASE WHEN memo IN ( 'Memo', 'Memo1' ) THEN amount END ) AS TotalSum
FROM dummy_query
GROUP BY id
| ID | MEMOVALUE | MEMO1VALUE | TOTALSUM |
|----|-----------|------------|----------|
| 1 | 10 | 20 | 30 |
您已经开始使用 pivot
的解决方案:
select id, memo, memo1, memo+memo1 msum from (
select * from dummy_query
pivot (sum(amount) for (memo) in ('Memo' memo,'Memo1' memo1)))
更传统,没有枢轴:
select id, memo, memo1, memo1+memo msum from (
select id,
sum(case when memo='Memo' then amount end) memo,
sum(case when memo='Memo1' then amount end) memo1
from dummy_query group by id)
我想弄清楚哪个看起来很简单,但我无法找到一种方法来做同样的事情。
考虑以下 table 和数据,
create table dummy_query
(id varchar2(20), amount number(10,2), memo varchar(20));
insert into dummy_query values('1', 10.00, 'Memo');
insert into dummy_query values('1', 20.00, 'Memo1');
我想获取以下值:
Id MemoValue Memo1Value TotalSum
----------
1 10.00 20.00 30.00
有没有办法通过这种方式获取数据?
谢谢!
我对 PIVOT 不是很熟悉,但是您尝试过的我确实在其上构建了查询。希望这是你需要的 -
SELECT a.*, b.SUM_AMT
FROM ((SELECT ID, amount, memo FROM dummy_query) PIVOT (SUM (amount)
FOR (memo)
IN ('Memo', 'Memo1'))) a,
( SELECT ID, SUM (AMOUNT) "SUM_AMT"
FROM dummy_query
GROUP BY id) b
WHERE a.id = b.id
可以有更好的方法来解决这个问题,所以让我们看看其他人必须分享什么。
Oracle 11g R2 架构设置:
create table dummy_query (id, amount, memo) AS
SELECT '1', 10.00, 'Memo' FROM DUAL
UNION ALL SELECT '1', 20.00, 'Memo1' FROM DUAL
UNION ALL SELECT '1', 30.00, 'Memo2' FROM DUAL;
查询 1:
如果 TotalSum
是所有备忘录金额的总和(而不仅仅是 Memo
和 Memo1
)那么你可以这样做:
SELECT ID,
SUM( CASE memo WHEN 'Memo' THEN amount END ) AS MemoValue,
SUM( CASE memo WHEN 'Memo1' THEN amount END ) AS Memo1Value,
SUM( amount ) AS TotalSum
FROM dummy_query
GROUP BY id
| ID | MEMOVALUE | MEMO1VALUE | TOTALSUM |
|----|-----------|------------|----------|
| 1 | 10 | 20 | 60 |
查询 2:
但是如果 TotalSum
只是 MemoValue + Memo1Value
则添加一个 where 子句:
SELECT ID,
SUM( CASE memo WHEN 'Memo' THEN amount END ) AS MemoValue,
SUM( CASE memo WHEN 'Memo1' THEN amount END ) AS Memo1Value,
SUM( amount ) AS TotalSum
FROM dummy_query
WHERE memo IN ( 'Memo', 'Memo1' )
GROUP BY id
| ID | MEMOVALUE | MEMO1VALUE | TOTALSUM |
|----|-----------|------------|----------|
| 1 | 10 | 20 | 30 |
查询 3:
或者,如果您出于其他原因需要包含所有行,那么您可以这样做:
SELECT ID,
SUM( CASE memo WHEN 'Memo' THEN amount END ) AS MemoValue,
SUM( CASE memo WHEN 'Memo1' THEN amount END ) AS Memo1Value,
SUM( CASE WHEN memo IN ( 'Memo', 'Memo1' ) THEN amount END ) AS TotalSum
FROM dummy_query
GROUP BY id
| ID | MEMOVALUE | MEMO1VALUE | TOTALSUM |
|----|-----------|------------|----------|
| 1 | 10 | 20 | 30 |
您已经开始使用 pivot
的解决方案:
select id, memo, memo1, memo+memo1 msum from (
select * from dummy_query
pivot (sum(amount) for (memo) in ('Memo' memo,'Memo1' memo1)))
更传统,没有枢轴:
select id, memo, memo1, memo1+memo msum from (
select id,
sum(case when memo='Memo' then amount end) memo,
sum(case when memo='Memo1' then amount end) memo1
from dummy_query group by id)