# Case When


## Case When


Команда **CASE WHEN** в PostgreSQL позволяет создавать вычисляемые поля на основе условий. Рассмотрим таблицу **cats**:

| icon | name | month | kg | owner |
| --- | --- | --- | --- | --- |
| 😺 | Tom | 15 | 5 | 👨 |
| 🐱 | Sylvester | 25 | 8 | 👩 |
| 😸 | Garfield | 50 | 12 | null |
| 🙀 | Nemo | 7 | 3 | 👵 |

### Определить вес каждого кота:

```sql
SELECT name,
       kg,
       CASE
           WHEN kg
```

Результат:

```sql
Tom        5    обычный
Sylvester  8    обычный
Garfield   12   толстый
Nemo       3    худой
```

### Классифицировать на котенка или кота в зависимости от возраста:

```sql
SELECT name,
       month,
       CASE
           WHEN month
```

Результат:

```sql
Tom        15   кот
Nemo       7    котенок
```

### Определить статус кота в зависимости от наличия владельца:

```sql
SELECT name,
       owner,
       CASE
           WHEN owner IS NULL THEN 'дикий'
           ELSE 'домашний'
       END AS living_condition
FROM cats;
```

Результат:

```sql
Tom        👨   домашний
Garfield   null дикий
```

**CASE WHEN** используем для создания нового поля с условием. Новое поле появляется в результирующей выборке.

## Анонимные отзывы ⚡️


А мы снова возвращаемся к еде! В небольшом туристическом городе открылась сеть из трех ресторанов "Емеля-Скуеля".  Великолепие домашней кухни каждого из трех ресторанов изящно дополняет сомнительный сервис и добротная порция провинциального кринжа. Вся надежда владельцев ресторана – на онлайн отзывы, которые могут оставить гости. В этом разделе нам предстоит с ними поработать.

Начнем с вывода отзывов –  из таблицы `feedback`. Не все из них подписаны. Если в поле `guest` указано имя, выведите значение в колонке `author`. Если поле `guest` не заполнено, выведите "Анонимный".

**Feedback**

| guest | value | waiter | location |
| --- | --- | --- | --- |
| Alice | 5 | Igor | Central District |
| Bob | 4 | Igor | Central District |
| Charlie | 3 | Igor | Central District |

## Позитивный негативный смешанный ⚡️


Добавьте колонку `impression`, чтобы классифицировать отзывы:

- Если `value` меньше 3.5 — пометьте как 'negative'.
- Если `value` больше 4.5 — как 'positive'.
- Во всех остальных случаях (от 3.5 до 4.5 включительно) — как 'neutral'.

**Отзывы клиентов**

| guest | comment | value | waiter |
| --- | --- | --- | --- |
| Alice | Good service | 5 | Igor |
| Bob | Tasty meal | 4 | Igor |
| Charlie | Average experience | 3 | Igor |

## Срочные оценки ⚡️


Чем хуже отзывы, тем более срочно нужно принимать меры!  Поле `urgent` будет указывать, насколько срочно нужно им заняться. Выставьте Yes для отзывов с оценками 1 и 2, выстаьте No для всех остальных.

**feedback**

| guest | comment | value | waiter |
| --- | --- | --- | --- |
| Alice | Good service | 5 | Igor |
| Eve | Could be better | 2 | Igor |
| Kim | Food was cold | 2 | Anna |

## Сгрупировать по району ⚡️


Выведите количество оценок (loc_count) и среднюю оценку (loc_avg) каждого ресторана (негативный, нейтральный или позитивный) на основе среднего балла всех отзывов. Позитивной считается оценка от 4.5 включительно , негативной – ниже 3.5 включительно ,  остальное – нейтральная

**feedback**

| guest | comment | value | waiter |
| --- | --- | --- | --- |
| Alice | Good service | 5 | Igor |
| Bob | Tasty meal | 4 | Igor |
| Charlie | Average experience | 3 | Igor |

## Только полные отзывы ⚡️


Каждый отзыв о качестве нашего сервиса имеет информацию об авторе, комментарий и оценку. Давайте определим,полный ли отзыв, то есть содержит ли он все три компонента. Если да – значение колонки `detailed` будет `full` если нет – `partial`. Подсказка: Используйте операторы `IS NOT NULL`

**feedback**

| guest | comment | value | waiter |
| --- | --- | --- | --- |
| Alice | Good service | 5 | Igor |
| Bob | Tasty meal | 4 | Igor |
| Charlie | Average experience | 3 | Igor |

## Привязать к менеджеру ⚡️


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

Выведите все отзывы с оценками 1, 2, 3 и примените следующее правило: если район `Central` или `Northern` – укажите менеджера `Алексей`. Если район `Southern`, укажите менеджера `Ирина`

**feedback**

| guest | comment | value | waiter | location |
| --- | --- | --- | --- | --- |
| Alice | Good service | 5 | Igor | Central District |
| Grace | Loved the food | 5 | Anna | Northern District |
| Mallory | Great location | 5 | Sergey | Southern District |

## Доля хороших ⚡️


Кто работает лучше? Нам нужно определить долю позитивных оценок (4 и 5) от всего количества отзывов для каждого официанта.

Выведите официанта, количество позитивных оценок с помощью CASE WHEN, выведите количеств всех оценок, затем поделите одно на другое – это и будет доля хороших отзывов.

Чтобы деление было корректным, используйте 1.0 вместо 1 и 0.0 вместо 0.

**feedback**

| guest | value | waiter | location |
| --- | --- | --- | --- |
| Alice | 5 | Igor | Central District |
| Bob | 4 | Igor | Central District |
| Charlie | 3 | Igor | Central District |

## Доля негативных ⚡️


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

Посчитайте количество негативных отзывов относительно общего количества отзывов для каждой локации.  Используйте операторы `GROUP BY`, `COUNT` и `SUM`.

**Таблица отзывов**

| guest | comment | value | location |
| --- | --- | --- | --- |
| Alice | Good service | 5 | Central District |
| Bob | Tasty meal | 4 | Central District |
| Grace | Loved the food | 5 | Northern District |

## Классификация гостей ⚡️


В этом задании мы работаем с отзывами гостей ресторана. Каждому гостю дано имя, он оставляет комментарий и оценку в виде целого числа. Эти оценки и комментарии сохраняются в базе данных, включая информацию о официанте и расположении заведения.

Сгруппируйте отзывы по каждому гостю. Рассчитайте средний балл отзыва для каждого гостя и количество его оценок: "Частый гость" – был больше 3 раз, "Редкий гость" – был 2 или 3 раза или "Впервые" в зависимости от количества оценок. Сортировка не требуется. Используйте операторы группировки и вычисления среднего значения.

**Таблица отзывов**

| guest | comment | value | waiter | location |
| --- | --- | --- | --- | --- |
| Alice | Good service | 5 | Igor | Central District |
| Bob | Tasty meal | 4 | Igor | Central District |
| Charlie | Average experience | 3 | Igor | Central District |

## Нам не нравится Игорь! ⚡️


В этой задаче посчитаем средний балл по оценкам, дадим оценку официанту, хорошо ли он работает. Рассчитайте средний балл для каждого официанта и определите категорию (плохо — меньше 3.5, хорошо — больше 4.5, остальное — нормально) на основе среднего балла.

**Отзывы (feedback)**

| guest | value | waiter |
| --- | --- | --- |
| Alice | 5 | Igor |
| Bob | 4 | Igor |
| Charlie | 3 | Igor |
