2013-05-15 2 views
0

Я новичок, я работаю с SQL Server 2008 R2 У меня есть 3 таблицы (базы данных фильмотеки) клиентов и жанры кино, клиентов и актеров, клиенты и директора, запрос, который я должен реализовать этоSQL максимальное значение отображения запроса или все значения одного клиента

«дисплей любимый актер, режиссер, любимый тип фильма (жанр) , где любимый означает, что фильм был сдан в аренду наибольшее количество раз»

а таблицы, которые были упомянуты выше, имели Id, имени клиента клиента (для таблиц с актерами) актера ид, имя актера, раз фильма с этим конкретным актером был взят клиентом, то же самое я имею в других таблицах (любимый жанр фильма, любимый режиссер)

Проблема в том, что у меня есть клиенты, которые не имеют максимального значения или имеют несколько значений с одинаковым номером, т.е. MAX() здесь не работают.

пожалуйста, если кто-нибудь может помочь?

вот код для любимой таблицы режиссера:

enter code here CREATE VIEW CustFavorDirector AS 
SELECT CustTakenFilms.CustomerID ,CustTakenFilms.[Customer Name], 
ActorDirector.ParticipantID, ActorDirector.[Participant Name],     COUNT(ActorDirector.ParticipantID) 'Times was taken' 
FROM 
(
SELECT 
Cust.CustomerID, 
Cust.FirstName + ' ' + Cust.LastName AS 'Customer Name' , 
Fil.FilmID, Fil.FilmName 
FROM 
FilmLibrary.dbo.Customer AS Cust 
INNER JOIN 
FilmLibrary.dbo.Rental AS Rent 
ON 
Cust.CustomerID = Rent.CustomerID 
INNER JOIN 
FilmLibrary.dbo.RentalDetails AS RentDet 
ON 
Rent.RentalID = RentDet.RentalID 
INNER JOIN 
FilmLibrary.dbo.FilmCopy AS FilCop 
ON 
RentDet.FilmCopyID = FilCop.FilmCopyID 
INNER JOIN 
FilmLibrary.dbo.Film AS Fil 
ON 
FilCop.FilmID = Fil.FilmID 
) AS CustTakenFilms 
INNER JOIN 
(
SELECT Film.FilmID, Film.FilmName,Part.ParticipantID , Part.FirstName + ' ' +  Part.LastName AS 'Participant Name', Rol.RoleTypeName 
FROM 
FilmLibrary.dbo.Film AS Film 
INNER JOIN 
FilmLibrary.dbo.FilmDetails AS FilDet 
ON 
Film.FilmID = FilDet.FilmID 
INNER JOIN 
FilmLibrary.dbo.Participant AS Part 
ON 
FilDet.ParticipantID = Part.ParticipantID 
INNER JOIN 
FilmLibrary.dbo.RoleType AS Rol 
ON 
FilDet.RoleTypeID = Rol.RoleTypeID 
WHERE Rol.RoleTypeName IN ('Director') 
) AS ActorDirector 
ON 
CustTakenFilms.FilmID = ActorDirector.FilmID 
GROUP BY CustTakenFilms.CustomerID , CustTakenFilms.[Customer Name], 
ActorDirector.ParticipantID, ActorDirector.[Participant Name] 

это то, что я получаю, когда я пытаюсь сделать выбор на этой точке зрения:

CustomerID Customer Name ParticipantID Participant Name Times was taken 
    111123  Abel Smith    1  Clark Foster    2 
    111123  Abel Smith    15  Philip Morris    2 
    111456  Aurora Jones    13  Clay Johnson    2 
    111456  Aurora Jones    14  Brittany Walker   1 
    111456  Aurora Jones    15  Philip Morris    1 
    111789  Alejandro Wil   12  Andrey Konchalovsky  2 
    111789  Alejandro Wil   14  Brittany Walker   2 
    112123  Ayana Thomas    12  Andrey Konchalovsky  3 
    112123  Ayana Thomas    15  Philip Morris    1 
    112123  Ayana Thomas    16  Xavier Lonso    1 
    113456  Daniel Bell    12  Andrey Konchalovsky  1 
    113456  Daniel Bell    13  Clay Johnson    2 
    113456  Daniel Bell    14  Brittany Walker   3 
    113456  Daniel Bell    15  Philip Morris    1 
+2

Можете ли вы, по крайней мере, предоставить образцы записей с желаемым результатом? –

+0

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

+0

Один из способов сделать это - получить совокупный подсчет количества раз, когда у них есть какой-либо директор, и добавить столбец Row_Number(), разделенный клиентом и упорядоченный по счету Desc в CTE, а затем вернуть результаты, где столбец Row_Number() равен 1. Если вы хотите попробовать это самостоятельно, вам нужно исследовать «Общие выражения таблиц» и «Оконные функции». –

ответ

0

Если взять ваш точный вид, что вы уже создайте, оберните его в CTE, используйте второй CTE, чтобы получить максимальный размер для каждого клиента, а затем присоедините его к первому CTE, вы можете его получить. Что-то вроде нижеследующего:

CREATE VIEW CustFavorDirector AS 

with CustDirectorRentals as (
    SELECT CustTakenFilms.CustomerID ,CustTakenFilms.[Customer Name], 
    ActorDirector.ParticipantID, ActorDirector.[Participant Name],     COUNT(ActorDirector.ParticipantID) 'Times was taken' 
    FROM 
    (
    SELECT 
    Cust.CustomerID, 
    Cust.FirstName + ' ' + Cust.LastName AS 'Customer Name' , 
    Fil.FilmID, Fil.FilmName 
    FROM 
    FilmLibrary.dbo.Customer AS Cust 
    INNER JOIN 
    FilmLibrary.dbo.Rental AS Rent 
    ON 
    Cust.CustomerID = Rent.CustomerID 
    INNER JOIN 
    FilmLibrary.dbo.RentalDetails AS RentDet 
    ON 
    Rent.RentalID = RentDet.RentalID 
    INNER JOIN 
    FilmLibrary.dbo.FilmCopy AS FilCop 
    ON 
    RentDet.FilmCopyID = FilCop.FilmCopyID 
    INNER JOIN 
    FilmLibrary.dbo.Film AS Fil 
    ON 
    FilCop.FilmID = Fil.FilmID 
    ) AS CustTakenFilms 
    INNER JOIN 
    (
    SELECT Film.FilmID, Film.FilmName,Part.ParticipantID , Part.FirstName + ' ' +  Part.LastName AS 'Participant Name', Rol.RoleTypeName 
    FROM 
    FilmLibrary.dbo.Film AS Film 
    INNER JOIN 
    FilmLibrary.dbo.FilmDetails AS FilDet 
    ON 
    Film.FilmID = FilDet.FilmID 
    INNER JOIN 
    FilmLibrary.dbo.Participant AS Part 
    ON 
    FilDet.ParticipantID = Part.ParticipantID 
    INNER JOIN 
    FilmLibrary.dbo.RoleType AS Rol 
    ON 
    FilDet.RoleTypeID = Rol.RoleTypeID 
    WHERE Rol.RoleTypeName IN ('Director') 
    ) AS ActorDirector 
    ON 
    CustTakenFilms.FilmID = ActorDirector.FilmID 
    GROUP BY CustTakenFilms.CustomerID , CustTakenFilms.[Customer Name], 
    ActorDirector.ParticipantID, ActorDirector.[Participant Name] 
) 
, CustMaxRentals AS (
    SELECT CustomerID, max([Times was taken]) AS MaxTimesTaken 
    FROM CustDirectorRentals 
) 
SELECT cdr.* 
FROM CustDirectorRentals cdr 
     JOIN CustMaxRentals cmr ON cdr.CutomerId = cmr.CustomerId AND cdr.[Times was taken] = cmr.MaxTimesTaken; 
Смежные вопросы