簡體   English   中英

SQL 查詢按總和排序

[英]SQL query to order by sum of sums

提前感謝您的幫助。

解釋我的問題最簡單的方法可能是用一個例子,所以我建立了一個沙盒數據庫,有兩個表和以下內容:

分類

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

籃子

 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

我想要做的是查詢每個類別的總和,如下所示:

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;

返回:

 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

結果表正是我想要的,除了排序。 我想按總和對每個超類別進行排序,然后在每個超類別中按總和對每個類別進行排序。 所以我想要這張桌子的順序是:


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

我對 SQL 沒有足夠的經驗,不知道如何最好地做到這一點。 我嘗試了一些嵌套的 SELECT 函數,但沒有弄清楚如何讓它正常工作,或者這是否是最好的方法。

您是否正在尋找這個:

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

您可以使用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;

演示
結果:

> 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

試試這個並使用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

在這個sqlfiddle中查看結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM