Проблема с запросом в SQL - PullRequest
0 голосов
/ 04 июня 2019

У меня следующие неудобства с SQL.
Я должен перечислить содержание, воспроизведенное более 3 раз в каждом месяце 2018 года и менее 2 в месяцы, которые идут в 2019 году.

Структура для этого следующая:

CREATE TABLE content (
    content INT NOT NULL,
    CONSTRAINT PK_Codcontent PRIMARY KEY(Codcontent) 
)

CREATE TABLE Reproduced (
    Coduser INT NOT NULL,
    Codcontent INT NOT NULL,
    CONSTRAINT PK_Coduser PRIMARY KEY(Coduser, Codcontent),
    CONSTRAINT FK_Codusr FOREIGN KEY(Coduser) REFERENCES Perfil(Codpuser),
    CONSTRAINT FK_Codcont FOREIGN KEY(Codcontent) REFERENCES Contenido(Codcontent)
)

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

CREATE VIEW TODOSLOSMESES2018
AS
SELECT
      R.Codcontenido
     , count(*)Reproducciones
     , count(Distinct Month(R.fecha)) as 'Meses'
FROM (
       SELECT * 
       FROM Reproduce 
       WHERE fecha>='20180101' AND fecha<='20181231')R
group by Codcontenido
HAVING count(Distinct Month(R.fecha))=12

1 Ответ

1 голос
/ 04 июня 2019

Вы можете использовать условную агрегацию - но два уровня.Один по содержанию и месяцу, а другой по содержанию:

select codcontent
from (select codcontent, year(fecha) as yr, month(fecha) as mon, count(*) as cnt
      from reproduced r
      group by codcentent, year(fecha), month(fecha)
     ) r
group by codcontent
having sum(case when year = 2018 then 1 else 0 end) = 12 and  -- all months
       min(case when year = 2018 then cnt end) >= 3 and
       max(case when year = 2019 then cnt else 0 end) < 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...