【问题标题】:SQL: partition over two columnsSQL:在两列上分区
【发布时间】:2018-10-07 06:15:34
【问题描述】:

我有下表:

---------------------
| 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
  • @GordonLinoff 不,这些值永远不会为 NULL
  • 。 .没有作为编辑添加的“下一个问题”。您应该接受 Vamsi 的回答并提出另一个问题。

标签: sql oracle window-functions


【解决方案1】:

使用leastgreatest

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

【讨论】:

    【解决方案2】:

    只是一个想法:

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

    输出 - 您可以用任何值替换空值(空):

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

    【讨论】:

    • 感谢您的回答。您的 SQL 的问题是可以有多个行具有相同的 No1 和 No2 值。请参阅我的新问题:stackoverflow.com/questions/50174587/…
    • 然后呢?谁阻止了您在示例中创建多行?谁说 ROLLUP 在这种情况下不起作用?我不在乎这里的分数。这些是相同的分组集不同的方式。
    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多