Как СУММ с автозаполнением WHEN-предложения - PullRequest
0 голосов
/ 16 октября 2018

У меня есть таблица типа

munic | origin  | date       | hour     | presence 
9875  | Germany | 2016-10-08 | 15:00:00 | 56
9875  | French  | 2016-10-08 | 18:00:00 | 24
9875  | Italians| 2016-10-08 | 18:00:00 | 6

С суммой SUM я могу суммировать значения на основе некоторых условий, таких как:

SELECT munic, 
       SUM(presence) FILTER (WHERE origin = 'Germany' AND date = '2016-10-08' AND hour = '15:00:00') AS "Germany_2016-10-08_15:00:00"

Проблема заключается в том, что мне нужно суммировать значение встолбец присутствие , но на основе слишком большого числа условий, основанных на 3 полях, как показано ниже (8 дней x 8 часов, блок x 12 стран = 768 комбинаций), слишком много предложений фильтра для записи с клавиатуры.Идея состоит в том, чтобы получить конкретную сумму для каждой комбинации трех полей в таблице новостей.Вместо написания каждого предложения фильтра есть метод, который автоматически выбирает комбинации на основе общего правила?

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

Результат может быть:

   munic | Germany_2016-10-08_15:00:00 | French_2016-10-08_18:00:00 | Italians_2016-10-08_18:00:00
 9875    |    54                      |      24           |       6 

1 Ответ

0 голосов
/ 16 октября 2018

Во-первых, я бы начал с суммирования и именования всех этих данных, используя строки вместо столбцов.Вы можете включить (необязательно) предложение where, чтобы получить

 SELECT munic, origin, date, hour, sum(presence) 
  from my_tab
  /*OPTIONAL where clause to limit to specific countries, origins, dates, hours*/
  WHERE origin in ('Germany','Italy','France',....)
   and date in ('2016-10-08','2016-10-09',...)
  group by munic, origin, date, hour

С запросом, как написано выше, вы получите необходимые данные в виде строки (не столбца).Кроме того, вы НЕ получите «пустых» строк, где данных не существует.Пример: если в «Германии» нет строки для 2016-10-08 18:00:00, то она просто не будет существовать.Если вам нужны эти данные, вам нужно найти способ генерировать пустые строки.Один из способов сделать это - иметь таблицу, представление или подзапрос, который просто возвращает имя каждой страны ... затем есть другой, который возвращает каждый период времени, и другой, который возвращает каждую дату.Затем вы НАРУЖНО присоединяетесь к каждой из этих таблиц, что поможет создать ваши «пустые строки».

Более того, само собой разумеется, что ваши даты, часы или список стран могут измениться в будущем (пример:Вы запускаете '2016-10-08' прямо сейчас, но вам может понадобиться другая дата в следующий раз, когда вы запустите этот запрос, поэтому дополнительная проблема заключается в том, чтобы этот запрос не нуждался в куче правок каждый раз, когда вызапустите «отчет» по-разному.

Это большая часть проблемы, которая будет зависеть от вас, чтобы определить, что имеет смысл (мы ограничиваем данные вообще или просто получаем ВСЕ ... основаны ли даты на запросах)от «даты начала» + X лет и т. д.) С предоставленной вами информацией трудно сказать, что поможет в этом отношении.

После этого первоначального процесса «получения данных вФормат строки "завершен, теперь вам нужно будет сделать" поворот ", чтобы переключить строки в столбцы ... Как уже говорилось ранее, это не то, что SQL делает изначально или легко. Самое простое решение - это использоватьРешение без SQL для преобразования ваших данных в массив, объект или другую форму с использованием кода приложения.Конечно, это также может быть сделано с использованием pl / PGSQL или другого языка БД, или, в качестве альтернативы, (с большими усилиями) может быть преобразовано в SQL для возврата данных JSON в нужном формате.Конечно, вашему приложению все равно нужно будет правильно интерпретировать JSON, что логически приводит к выводу, что если вы можете писать код приложения, вы должны делать то, что проще всего .... и самым простым решением будет "Group / SUM"данные в SQL, затем переберите их и создайте окончательный набор данных в коде приложения.

...