Задать вопрос
weranda
@weranda

Как из двух таблиц создать одну с разбивкой по датам по колонкам?

Таблица 1 (запросы = Query)
id
group
query

Таблица 2 (позиции = Positon)
id
query_id (внешний ключ = Query.id)
google
yandex
date

Можно сделать запрос по конкретной дате:
SELECT 
    Query.query, Position.yandex
FROM
    Query
INNER JOIN
    Position ON
    Query.id = Position.query_id
;


И тогда получится таблица вот такая:
Запрос + Позиция

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

Вот так нужно сделать:
Запрос + Позиция в дату 1 + Позиция в дату 2 + Позиция в дату 3 и т. д.
665064e8bc095546193932.png
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Зависит от конкретной СУБД. Может быть функция PIVOT, а если её нет - колхозить заменяющую процедуру.
Ответ написан
Комментировать
@alexalexes
Сначала выбираете доступные даты:
SELECT distinct P.date
FROM Query Q
JOIN Position P ON Q.id = P.query_id
where P.Date between _ and _

Потом, строите динамический запрос в той среде выполнения кода, где вызывали первый запрос:
SELECT Q.Query,
             QP1.Cnt,
             QP2.Cnt,
             ......
FROM Query Q JOIN Position P ON Q.id = P.query_id
left join (select Q1.Query, P1.Date, count(*) as Cnt from Query Q1 JOIN Position P1 ON Q1.id = P1.query_id group by Q1.Query, P1.Date) QP1 on QP1.Query = Q.uery and P1.Date = P.Date
left join (select Q2.Query, P2.Date, count(*) as Cnt from Query Q2 JOIN Position P2 ON Q2.id = P2.query_id group by Q2.Query, P2.Date) QP2 on QP2.Query = Q.Query and P1.Date = P.Date
....
where P.Date between _ and _
    and (QP1.Cnt > 0 or QP1.Query is null)
    and (QP2.Cnt > 0 or QP2.Query is null)
    ....

Строк в каждом секции с ... должно быть столько, сколько дат.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы