簡體   English   中英

SQL | 如何對 3 個項目的分區組求和?

[英]SQL | How to sum over partition group of 3 items?

我試圖獲得前 3 種產品類別的一天收入百分比,但在這個百分比上苦苦掙扎。 我已經將每個產品的收入排在第 1 到第 3 位,但不知道如何獲得該百分比。

任何指針將不勝感激。

SELECT * FROM (
SELECT   date, 
         category_name,
         revenue,
         row_number() OVER(PARTITION BY DATE(date) ORDER BY revenue DESC) AS category_rank,
         (revenue / (select sum(revenue) from a group by 1)) * 100 percentage AS percentage_of_daily_total -- this is the wrong one 

  FROM (
    SELECT DATE(orders.order_timestamp) AS date,
           products.product_cat AS category_name,
           ROUND(SUM(payments.payment)) AS revenue
    FROM table1.orders orders
    JOIN table1.t_payments payments ON orders.order_id = payments.order_id
    JOIN table1.t_items items ON orders.order_id = items.order_id
    JOIN table1.t_products products ON items.product_id = products.product_id
    GROUP BY 1 ,2) a) b
WHERE category_rank <= 3;

樣本數據如下:日期、類別名稱、收入、類別排名

2016-10-05  jeans       20  1
2016-10-05  shirts      15  2
2016-10-05  shoes       10  3
2016-10-06  skirts      50  1
2016-10-06  sports_wear 30  2
2016-10-06  accesories  10  3

期望的結果:日期、類別名稱、收入、類別排名、百分比_每日總和

2016-10-05  jeans       30  1  50
2016-10-05  shirts      20  2  33
2016-10-05  shoes       10  3  17
2016-10-06  skirts      20  1  50 
2016-10-06  sports_wear 16  2  40
2016-10-06  accessories 4   3  10

使用CTE

WITH a AS (
    SELECT DATE(orders.order_timestamp) AS date,
           products.product_cat AS category_name,
           ROUND(SUM(payments.payment)) AS revenue
    FROM table1.orders orders
    JOIN table1.t_payments payments ON orders.order_id = payments.order_id
    JOIN table1.t_items items ON orders.order_id = items.order_id
    JOIN table1.t_products products ON items.product_id = products.product_id
    GROUP BY 1 ,2
)

SELECT * FROM (
SELECT   a.date, 
         a.category_name,
         a.revenue,
         row_number() OVER(PARTITION BY DATE(a.date) ORDER BY a.revenue DESC) AS category_rank,
         (a.revenue / b.revenue_sum) * 100 percentage AS percentage_of_daily_total
  FROM a
  JOIN (SELECT date, sum(revenue) AS revenue_sum FROM a GROUP BY 1) AS b
  ON a.date = b.date)
WHERE category_rank <= 3;

您的原始查詢非常接近。 計算 OUTERMOST sql 中的百分比。 所以放棄你的百分比計算,然后在外部 Select 中:

Select *, 100*revenue/(sum(revenue) Over (Partition by Date)) as percentage_of_daily_total

請記住,當您開始計算窗口函數時,Where 子句已經執行並且您每天減少到 3 條記錄,因此任何總數都將僅基於前 3 條。

暫無
暫無

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

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