如何在 postgres 的组中使用多个过滤器?

How do I use multiple filters in a group by in postgres?

希望创建一个报告 table 按日期分组,但在几个不同的过滤器上求和。

例如,假设我有一家公司的多个营业地点,我想对按日期分组的销售额求和。

这么说来源table

Date  |  Location  | Amount
===========================
Mon   |   One      | 10
Mon   |   Two      | 15
Mon   |   One      | 12
Tue   |   One      | 13
Tue   |   Three    | 17

我想将其转换为

Date  |  Location One Sales | Location Two Sales
================================================
Mon   |   22                | 15
Tue   |   13                | 0

现在正在绞尽脑汁,运行撞墙了。

谢谢!

您可以使用 CASE 有条件地 select。


SQL Fiddle

PostgreSQL 9.6 架构设置:

CREATE TABLE Sales
    ("Date" varchar(3), "Location" varchar(5), "Amount" int)
;

INSERT INTO Sales
    ("Date", "Location", "Amount")
VALUES
    ('Mon', 'One', 10),
    ('Mon', 'Two', 15),
    ('Mon', 'One', 12),
    ('Tue', 'One', 13),
    ('Tue', 'Three', 17)
;

查询 1:

SELECT   "Date"
         , sum(case "Location" when 'One' then "Amount" else 0 end) as "Location One Sales"
         , sum(case "Location" when 'Two' then "Amount" else 0 end) as "Location Two Sales"
FROM     Sales
GROUP BY "Date"

Results:

| Date | Location One Sales | Location Two Sales |
|------|--------------------|--------------------|
|  Mon |                 22 |                 15 |
|  Tue |                 13 |                  0 |

鉴于此数据:

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    date TEXT,
    location TEXT,
    amount INT
);

INSERT INTO sales (date, location, amount) VALUES
('Mon', 'One', 10),
('Mon', 'Two', 15),
('Mon', 'One', 12),
('Tue', 'One', 13),
('Tue', 'Thr', 17)
;

您可以像这样手动构建列:

SELECT
date,
SUM(CASE WHEN location='One' THEN amount ELSE 0 END) AS loc_one,
SUM(CASE WHEN location='Two' THEN amount ELSE 0 END) AS loc_two
FROM 
  sales
GROUP BY date
ORDER BY date;

但也许更可靠的解决方案是在两个字段上都使用 group-by。

SELECT
date,
location,
SUM(amount)
FROM 
  sales
GROUP BY date, location
ORDER BY date, location;

SQLFiddle 位于:http://www.sqlfiddle.com/#!17/7417e/9