Oracle sql:使用GROUP BY ROLLUP排序

时间:2017-02-07 17:54:38

标签: sql oracle group-by sql-order-by rollup

我正在寻找答案,但似乎没有什么能比得上我的问题。因此,使用汇总查询:

select year, month, count (sale_id) from sales 
group by rollup (year, month);

会给出如下结果:

  YEAR      MONTH     TOTAL
  2015          1     200
  2015          2     415
  2015       null     615
  2016          1     444
  2016          2     423
  2016       null     867
  null       null    1482

而且我想按总计desc排序,但我希望年度总数最高(重要的是:所有记录与该年相比),然后是其他年份的其他记录。所以我希望它看起来像:

  YEAR      MONTH     TOTAL
  null       null    1482
  2016       null     867
  2016          1     444
  2016          2     423
  2015       null     615
  2015          2     415
  2015          1     200

或类似的东西。主要目的是在与总数进行排序时,不要将“拆分”记录与一年相比。有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

嗯。我认为这样做你想要的:

select year, month, count(sale_id) as cnt
from sales 
group by rollup (year, month)
order by sum(count(sale_id)) over (partition by year) desc, year;

实际上,我从未在order by中使用带有rollup查询的窗口函数。如果需要子查询,我不会感到惊讶。

答案 1 :(得分:0)

尝试使用窗口函数max来获取order by子句中每年的最大总数:

select year, month, count(sale_id) total
from sales
group by rollup(year, month)
order by max(total) over (partition by year) desc, total desc;

答案 2 :(得分:0)

我认为您需要使用GROUPING SETS和GROUP_ID。这些将帮助您确定由小计引起的NULL。请查看文档:{​​{3}}