简体   繁体   English

SQL 查询按总和排序

[英]SQL query to order by sum of sums

Thanks in advance for any help.提前感谢您的帮助。

The easiest way to explain my question is probably with an example, so I set up a sandbox database with two tables and the following contents:解释我的问题最简单的方法可能是用一个例子,所以我建立了一个沙盒数据库,有两个表和以下内容:

Categories :分类

 supercategory | category
---------------+----------
 fruit         | apple
 fruit         | orange
 fruit         | banana
 vegetable     | carrot
 vegetable     | onion
 vegetable     | celery
 grain         | rice
 grain         | wheat
 grain         | barley

Baskets :篮子

 category | amount
----------+--------
 apple    |      2
 carrot   |      4
 wheat    |      1
 orange   |      5
 celery   |      4
 orange   |      3
 barley   |      2
 barley   |      5
 apple    |      1
 carrot   |      2
 rice     |      5
 wheat    |      3
 onion    |      2

What I want to do is query the sum of each category, like this:我想要做的是查询每个类别的总和,如下所示:

SELECT 
    categories.superCategory, baskets.category, 
    SUM(baskets.amount::numeric) AS categorySum
FROM
    baskets 
LEFT OUTER JOIN 
    categories ON categories.category = baskets.category
GROUP BY 
    categories.superCategory, baskets.category
ORDER BY 
    superCategory;

Which returns:返回:

 category | supercategory | categorysum
----------+---------------+-------------
 apple    | fruit         |           3
 orange   | fruit         |           8
 barley   | grain         |           7
 rice     | grain         |           5
 wheat    | grain         |           4
 carrot   | vegetable     |           6
 celery   | vegetable     |           4
 onion    | vegetable     |           2

That resulting table is exactly what I want, except for the ordering.结果表正是我想要的,除了排序。 I'd like to order by each supercategory by sum, and then within each supercategory order each category by its sum.我想按总和对每个超类别进行排序,然后在每个超类别中按总和对每个类别进行排序。 So the order I want this table in would be:所以我想要这张桌子的顺序是:


barley | grain     | 7      <---- The total for the "grain" supercategory is 16, so put it first
rice   | grain     | 5
wheat  | grain     | 4
carrot | vegetable | 6      <---- The total for vegetables is 12
celery | vegetable | 4
onion  | vegetable | 2
orange | fruit     | 8      <---- The total for fruits is 11
apple  | fruit     | 3

I'm not experienced enough about SQL to know how best to accomplish this.我对 SQL 没有足够的经验,不知道如何最好地做到这一点。 I had tried some nested SELECT functions, but wasn't figuring out how to get that to work right, or if that is even the best approach.我尝试了一些嵌套的 SELECT 函数,但没有弄清楚如何让它正常工作,或者这是否是最好的方法。

Are you looking for this:您是否正在寻找这个:

select superCategory, category , categorySum from (
SELECT 
    categories.superCategory, baskets.category, 
    SUM(baskets.amount) over ( partition by categories.superCategory,baskets.category) AS categorySum
FROM
    baskets 
LEFT OUTER JOIN 
    categories ON categories.category = baskets.category
) X
group by superCategory, category , categorySum
ORDER BY SUM(categorySum) over ( partition by superCategory) DESC,categorySum desc

You can do it with the window function SUM() in the ORDER BY clause:您可以使用ORDER BY子句中的 window function SUM()来做到这一点:

SELECT b.category, 
       c.superCategory, 
       SUM(b.amount::numeric) AS categorySum
FROM baskets b LEFT OUTER JOIN categories c
ON c.category = b.category
GROUP BY c.superCategory, b.category
ORDER BY SUM(SUM(b.amount::numeric)) OVER (PARTITION BY c.superCategory) DESC, 
         categorySum DESC;

See the demo .演示
Results:结果:

> category | supercategory | categorysum
> :------- | :------------ | ----------:
> barley   | grain         |           7
> rice     | grain         |           5
> wheat    | grain         |           4
> carrot   | vegetable     |           6
> celery   | vegetable     |           4
> onion    | vegetable     |           2
> orange   | fruit         |           8
> apple    | fruit         |           3

Try this and use JOIN and subquery :试试这个并使用JOINsubquery

SELECT T.category
     , T.superCategory
     , T.Sums AS categorySum
  FROM
       (
        SELECT categories.superCategory
             , baskets.category
             , SUM(baskets.amount) AS Sums
         FROM baskets
         JOIN categories ON categories.category = baskets.category
        GROUP BY categories.superCategory, baskets.category
      )T
 JOIN (
       SELECT categories.superCategory
            , SUM(baskets.amount) AS Sums
         FROM baskets
         JOIN categories ON categories.category = baskets.category
        GROUP BY categories.superCategory
      )TA ON T.superCategory = TA.superCategory
ORDER BY TA.Sums DESC, T.Sums DESC

See result in this sqlfiddle在这个sqlfiddle中查看结果

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM