Как использовать несколько фильтров в группе в Postgres? - PullRequest
0 голосов
/ 21 июня 2019

Нужно создать таблицу отчетов, которая группирует по дате, но суммирует по нескольким различным фильтрам.

Например, скажем, у меня есть несколько местоположений компании, и я хочу суммировать продажи, сгруппированные по дате.

Так сказать исходная таблица

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

Сейчас я ломаю себе голову и врезаюсь в стену.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Учитывая эти данные:

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;

Но, возможно, более надежным решением является использование группировки в обоих полях.

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

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

1 голос
/ 21 июня 2019

Вы можете использовать CASE для условного выбора.


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"

Результаты :

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