簡體   English   中英

如何在兩列中使用不同的值進行聚合?

[英]How to aggregate using distinct values across two columns?

我在orders表中有以下數據:

revenue       expenses        location_1      location_2
3             6               London          New York
6             11              Paris           Toronto
1             8               Houston         Sydney
1             4               Chicago         Los Angeles
2             5               New York        London
7             11              New York        Boston
4             6               Toronto         Paris
5             11              Toronto         New York
1             2               Los Angeles     London
0             0               Mexico City     London

我想創建一個包含 3 列的結果集:

  1. 10不同城市名稱的列表
  2. 每個城市的收入總和
  3. 每個城市的費用總和

期望的結果是:

location         revenue    expenses
London           6          13
New York         17         33
Paris            10         17
Toronto          15         28
Houston          1          8
Sydney           1          8
Chicago          1          4
Los Angeles      2          6
Boston           7          11
Mexico City      0          0

是否可以聚合兩列的不同值? 如果是,我該怎么做?

這是一個小提琴:
http://sqlfiddle.com/#!9/0b1105/1

您可以 UNION ALL 兩個查詢,然后從中提取 select ...

select location, sum(rev) as rev, sum(exp) as exp
from (
  select location_1 as location, sum(revenue) as rev, sum(expenses) as exp
  from orders
  group by location_1
  union all
  select location_2 as location, sum(revenue) as rev, sum(expenses) as exp
  from orders
  group by location_2
)z
group by location
order by 1

更短(通常更快):

SELECT location, sum(revenue) AS rev, sum(expenses) AS exp
FROM  (
   SELECT location_1 AS location, revenue, expenses FROM orders
   UNION ALL
   SELECT location_2            , revenue, expenses FROM orders
   ) sub
GROUP  BY 1;

可能更快:

WITH cte AS (
   SELECT location_1, location_2, revenue AS rev, expenses AS exp
   FROM orders
   )
SELECT location, sum(rev) AS rev, sum(exp) AS exp
FROM  (
   SELECT location_1 AS location, rev, exp FROM cte
   UNION ALL
   SELECT location_2            , rev, exp FROM cte
   ) sub
GROUP  BY 1;

(具體化的)CTE 增加了開銷。 這可能超過收益,取決於許多因素,如總表大小、可用索引、可能的膨脹、可用 RAM、存儲速度、Postgres 版本。 ...

小提琴

暫無
暫無

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

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