【发布时间】:2013-05-16 00:14:04
【问题描述】:
我是初学者, 我使用 SQL Server 2008 R2 我有 3 个表(电影库的数据库) 客户和电影类型, 顾客和演员, 客户和董事, 我需要实现的查询是
"显示最喜欢的演员、导演、最喜欢的电影类型(类型) 其中最喜欢意味着电影被出租的次数最多”
上面提到的表格有客户的 Id , 客户名称(对于有演员的表) 演员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
【问题讨论】:
-
您至少可以给出您想要的结果的样本记录吗?
-
当然,如果在“时间”列中出现一个最大值,我想显示它,否则如果出现几个相同的最大值来显示它们,例如如果出现 1,2,3 然后显示3 ,如果出现 1,1,2,2 则只显示 2,2 。
-
您可以做到这一点的一种方法是获取他们获得任何董事的次数的总计数,并添加一个 Row_Number() 列由客户分区并按计数 Desc 排序CTE,然后返回 Row_Number() 列等于 1 的结果。如果你想自己尝试这个,你需要研究
Common Table Expressions和Windowed Functions。 -
我对大小写做了类似的事情,但它给了我错误的结果,例如当用户在“时间被占用”列中有值 1,2,2 如果我尝试使用 MAX() 它给出 2只有一次,但这不是我想要的,它应该给 2 两次。我不明白 CTE 在这里应该如何帮助我。据我了解 CTE 它是某种嵌套表,我也尝试使用它并且我只接收具有最大值的客户,而我需要它们。
标签: sql sql-server