Как перегруппировать и посчитать элементы в столбце - PullRequest
0 голосов
/ 20 июня 2019

У меня есть данные для задач, выданных в супермаркетах, организованных:

  • task_id - каждая отдельная задача имеет уникальный идентификатор
  • store_id - каждый магазин имеет уникальный номер, идентифицирующий его
  • week_start - начало недели, когда была назначена задача
  • категория - тип задания (кетчуп, горчица, хот-доги, бекон, ...)
  • busy - переменная true / false, если прогнозировалось, что она будет занята на этой неделе
  • manager - имя менеджера магазина

В настоящее время данные упорядочены по task_id (отдельная задача). Я бы хотел, чтобы они были упорядочены по магазинам и неделям, а затем подсчитывали количество задач, назначенных в категории на каждую неделю.

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

Я, по сути, пытаюсь отразить результаты того, что будет в сводной таблице, где store_id, week_start, busy и manager - это строки, категория - как столбцы, а затем сумма категории как данные в середине. Но в этом случае категория стала менее гранулированной с индексом (функция соответствия.

Я попытался запустить что-то похожее на

'' '' SQL

SELECT store_id, week_start, busy, mananger
COUNT(CASE WHEN category = 'hotdog' or 'bacon' or 'turkey') AS MEAT, 
COUNT(CASE WHEN category = 'ketchup' or 'mustard') AS Sauce
FROM table1 
GROUP BY store_id, week_start;

но получаю ошибку:

AnalysisException: синтаксическая ошибка в строке 2: не определено: соус "кетчуп") ^ Обнаружено: как и ожидалось: AND, МЕЖДУ, DIV, ILIKE, IN, IREGEXP, IS, LIKE, NOT, OR, REGEXP, RLIKE, THENED BY: BY Исключение: синтаксическая ошибка

1 Ответ

0 голосов
/ 20 июня 2019

Если вы хотите посчитать значения, то я предпочитаю sum() вместо count().В любом случае, вам нужно правильно сформированное case выражение:

SELECT store_id, week_start, mananger,
       SUM(CASE WHEN category IN ('hotdog','bacon', 'turkey') THEN 1 ELSE 0 END) AS MEAT, 
       SUM(CASE WHEN category IN ('ketchup', 'mustard') THEN 1 ELSE 0 END) AS Sauce
FROM table1 
GROUP BY store_id, week_start;

Я также удалил busy из списка SELECT.Неагрегированные столбцы в SELECT должны быть совместимы со столбцами в GROUP BY.

...