簡體   English   中英

Postgres SQL計算計算總數的平均值

[英]Postgres SQL calculate average of calculated totals

我正在嘗試編寫一個查詢來返回所有高於平均美元銷售額的產品。 相關的表格和列是:

  • 產品:prod_id:整數,價格:十進制
  • ORDERLINES:prod_id:整數,數量:整數

我可以編寫每個產品獲得美元銷售額的子查詢,但是我在將該平均函數應用於該子查詢時遇到了麻煩。 我嘗試的一切都會返回語法錯誤。 以下是我認為應該接近答案:

select avg(sum) as avg_sales 
from (
   select sum(b.quantity * a.price) as total_sales 
   from products a, orderlines b 
   where a.prod_id = b.prod_id 
   group by a.prod_id
);

當我嘗試這個時,我得到:

錯誤:FROM中的子查詢必須具有別名。

我不明白,但我是Postgres的新手。 無論如何,添加別名給了我:

select avg(totals) as avg_sales 
from (
    select sum(b.quantity * a.price) as total_sales 
    from products a, orderlines b 
    where a.prod_id = b.prod_id group by a.prod_id
) as totals;

當我嘗試這個時,我得到:錯誤:函數avg(記錄)不存在

我意識到上面的代碼只是獲得了整體平均銷售額。 如果我能獲得平均銷售額,那么應該很容易獲得高於平均水平的產品。

當我嘗試這個時,我得到:錯誤:函數avg(記錄)不存在

這是因為您將派生表的別名傳遞給avg()函數,這意味着您將完整的行(=記錄)傳遞給它,而不是單個列(值)。

要使其正常工作,您需要使用:

select avg(totals.total_sales) as avg_sales 
from (
    select sum(ol.quantity * p.price) as total_sales 
    from products p 
      join orderlines ol on p.prod_id = ol.prod_id
    group by p.prod_id
) as totals;

請注意,我用現代顯式JOIN運算符替換了古老的,過時的和脆弱的隱式連接。 如果你正在學習SQL,你應該習慣這種語法。


要獲得高於平均銷售額的產品,您需要同時計算:每種產品的銷售額平均銷售額。

這可以通過在聚合時使用窗口函數來實現:

select p.prod_id, 
       sum(ol.quantity * p.price) as total_sales, 
       avg(sum(ol.quantity * p.price)) over () as average_sales
from products p 
  join orderlines ol on p.prod_id = ol.prod_id
group by p.prod_id;

現在可以將其包裝在派生表中,以過濾掉總銷售額較低的表:

select *
from (
  select p.prod_id, 
         sum(ol.quantity * p.price) as total_sales, 
         avg(sum(ol.quantity * p.price)) over () as average_sales
  from products p 
    join orderlines ol on p.prod_id = ol.prod_id
  group by p.prod_id
) t
where total_sales >= average_sales;

SQLFiddle示例: http ://sqlfiddle.com/#!15/7f8ab/1

你可以嘗試這樣的事情。 首先使用子查詢查找平均銷售額,然后獲得高於該銷售額的所有產品

SELECT p.prod_id, o.quantity
    FROM products p INNER JOIN orderlines o
    ON p.prod_id = o.prod_id
    WHERE o.quantity  >  (      SELECT AVG(ol.quantity)
                                FROM products pr INNER JOIN orderlines ol
                                ON pr.prod_id = ol.prod_id
                        )

暫無
暫無

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

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