如何在同一列上聚合?

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

可以有更好的方法来解决这个问题,所以让我们看看其他人必须分享什么。

SQL Fiddle

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 是所有备忘录金额的总和(而不仅仅是 MemoMemo1)那么你可以这样做:

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

Results:

| 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

Results:

| 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

Results:

| 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)

SQLFiddle