SQL: совокупное число связанных моделей - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть следующая схема базы данных:

Магазин с полями: id, адрес, имя

Товар с полями: id, shop_id, категория (перечисление: одежда, мебель, электроника)

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

name     clothes  furniture  electronics
shop1       5        3          100

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Попробуйте использовать Pivot таблицу.

Sql Fiddle

Pivot:

PIVOT вращает табличное выражение, поворачивая уникальные значения изодин столбец в выражении на несколько столбцов в выходных данных и выполняет агрегирование, где они требуются для всех оставшихся значений столбцов, которые требуются в конечном выводе

Unpivot:

UNPIVOT выполняет операцию, противоположную PIVOT, вращая столбцы табличного выражения в значения столбцов.

Подробнее о Pivot

select *
from
(
  select name, value
  from(
  select name, category
  from test t
  join shop s on s.id = t.shop_id) as s
  unpivot
  (
    value
    for col in (category)
  ) unp
) src
pivot
(
  count(value)
  for value in ([clothes], [furniture], [electronics])
) piv
0 голосов
/ 18 сентября 2018

Если вы знаете нужные вам столбцы, я бы написал это следующим образом:

select s.name, 
       sum( (p.category = 'clothes')::int ) as clothes,
       sum( (p.category = 'furniture')::int ) as furniture,
       sum( (p.category = 'electronic')::int ) as electronic
from shop s join
     product p
     on s.id = p.shop_id
group by s.name;

Вы также можете рассмотреть crosstab() или динамический SQL, если вы не знаете столбцы.

0 голосов
/ 18 сентября 2018

использовать условное агрегирование:

select name, count(case when category='clothes' then 1 end) as clothes,
count(case when category='furniture' then 1 end) as furniture,
count(case when category='electronics' then 1 end) as electronic
from
(select name,category from shop inner join product 
on shop.id=product.shop_id)a
group by name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...