Найти выпуски по каждому журналу с максимальным и минимальным количеством страниц
Есть несколько журналов, в каждом из них есть определенное кол-во выпусков этих журналов и в каждом выпуске находятся несколько публикаций. У каждой публикации есть кол-во страниц. Необходимо найти для каждого журнала выпуск с максимальным/минимальным кол-вом страниц. Таблица имеет вид
CREATE table Журналы(
id_журнала INT identity PRIMARY KEY ,
Название VarChar(100) NOT NULL,
Издатель VArChar(100) NOT NULL
);
CREATE table Выпуски_журналов(
Индентификатор_выпуска INT identity PRIMARY KEY,
Номер_выпуска INT NOT NULL ,
Год INT
);
CREATE table Публикации(
Код_публикации INT identity PRIMARY KEY,
Индентификатор_выпуска int references Выпуски_журналов,
Название_публикации VArChar(100) NOT NULL ,
Страницы INT check (Страницы>=1 and Страницы<=15)
);
Ответы (1 шт):
Автор решения: pegoopik
→ Ссылка
Я возможно заморочился, просто настроение такое... Короче вот:
USE tempdb
GO
IF OBJECT_ID('Публикации') IS NOT NULL DROP TABLE Публикации
IF OBJECT_ID('Выпуски_журналов') IS NOT NULL DROP TABLE Выпуски_журналов
IF OBJECT_ID('Журналы') IS NOT NULL DROP TABLE Журналы
CREATE table Журналы(
id_журнала INT identity PRIMARY KEY ,
Название VarChar(100) NOT NULL,
Издатель VArChar(100) NOT NULL
);
CREATE table Выпуски_журналов(
Индентификатор_выпуска INT identity PRIMARY KEY,
Номер_выпуска INT references Журналы,
Год INT
);
CREATE table Публикации(
Код_публикации INT identity PRIMARY KEY,
Индентификатор_выпуска int references Выпуски_журналов,
Название_публикации VArChar(100) NOT NULL ,
Страницы INT check (Страницы>=1 and Страницы<=15)
);
GO
DECLARE
@Cnt INT = 3;
;WITH CTE AS(SELECT 1 N UNION ALL SELECT N+1 FROM CTE WHERE N<@Cnt)
INSERT Журналы SELECT NEWID(), NEWID() FROM CTE
;WITH CTE AS(SELECT 1 N UNION ALL SELECT N+1 FROM CTE WHERE N<@Cnt)
INSERT Выпуски_журналов SELECT id_журнала,
1000 + ABS(CAST(CAST(NEWID()AS VARBINARY) AS INT))%2000 --год, ну всякое бывает))
FROM Журналы, CTE
;WITH CTE AS(SELECT 1 N UNION ALL SELECT N+1 FROM CTE WHERE N<@Cnt)
INSERT Публикации
SELECT Индентификатор_выпуска, NEWID(), 1 + ABS(CAST(CAST(NEWID()AS VARBINARY) AS INT))%15
FROM CTE, Выпуски_журналов
--Собственно сам запрос
;
SELECT *
FROM(
SELECT Z.id_журнала, Z.Издатель, Z.Название
,Страницы
,MIN(Страницы)OVER(PARTITION BY Z.id_журнала) AS Min_Cnt
,MAX(Страницы)OVER(PARTITION BY Z.id_журнала) AS Max_Cnt
FROM Выпуски_журналов AS V
JOIN Публикации AS P ON V.Индентификатор_выпуска = P.Индентификатор_выпуска
JOIN Журналы AS Z ON Z.id_журнала = V.Номер_выпуска
)T
WHERE страницы IN (Min_Cnt, Max_Cnt)
--To receiver:
SELECT * FROM Журналы
SELECT * FROM Выпуски_журналов
SELECT * FROM Публикации
Думаю, разберётесь..