SQL:基于两列进行分区

3

I have following table:

---------------------
| No1 | No2  | Amount
---------------------
| A   |  B   |    10 |
| C   |  D   |    20 |
| B   |  A   |    30 |
| D   |  C   |    40 |
---------------------

我希望能够按照两列(No1,No2)分组,对分区内数据进行求和。当这两列的值发生变化时,也应该进行分组计算。例如:AB = BA。

这是我的期望结果:

-----------------------------------------
| No1 | No2  | Sum(Amount) over partition
-----------------------------------------
| A   |  B   |    40                    |
| C   |  D   |    60                    |
| B   |  A   |    40                    |
| D   |  C   |    60                    |
-----------------------------------------

有什么想法吗?

值是否会为NULL - Gordon Linoff
@GordonLinoff 不,这些值从未为NULL。 - ZerOne
没有作为编辑添加的“下一个问题”。您应该接受Vamsi的答案并提出另一个问题。 - Gordon Linoff
2个回答

6

使用 leastgreatest

select no1,no2,sum(amount) over(partition by least(no1,no2),greatest(no1,no2)) as total
from tbl

0

只是一个想法:

WITH test_data AS
(
SELECT 'A' no1, 'B' no2, 10 amt FROM dual
UNION ALL
SELECT 'C', 'D', 20 FROM dual
UNION ALL
SELECT 'B', 'A', 30 FROM dual
UNION ALL
SELECT 'D', 'C', 40 FROM dual
)
SELECT NVL(no1, break_group) no1, no2, total --, grp1, grp2, break_group 
  FROM
(
SELECT no1, no2, total
     , grouping(no1) grp1
     , grouping(no2) grp2
     , LAG(no1, 2) OVER (PARTITION BY total ORDER BY no1)||LAG(no1) OVER (PARTITION BY total ORDER BY no1) break_group
  FROM
( -- Vamsi Prabhala query --
select no1, no2
     , sum(amt) over(partition by least(no1,no2),greatest(no1,no2)) as total
from test_data
)
GROUP BY ROLLUP (total, no1, no2)
HAVING grouping(no1) + grouping(no2) = 0
OR grouping(no1) + grouping(no2) = 2
AND total IS NOT NULL
)
/

输出 - 您可以将 null(空)替换为任何值:

|NO1 |  NO2  | Total
----------------------
A        B      40
B        A      40
AB              40
C        D      60
D        C      60
CD              60

感谢您的回答。您的SQL存在问题,即可能存在具有相同No1和No2值的多行数据。请查看我的新问题:https://stackoverflow.com/questions/50174587/sql-insert-rows-with-summarized-values - ZerOne
还有谁阻止你在示例中创建多行?谁说ROLLUP在这种情况下不起作用?我不在乎分数。这些是相同的分组集,只是不同的方式。 - Art

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接