[英]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
試試這個並使用JOIN
和subquery
:
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.