如何在 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。
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"
| 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
希望创建一个报告 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。
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"
| 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