【问题标题】:sql query display maximum value or all values per customersql查询显示最大值或每个客户的所有值
【发布时间】: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 ExpressionsWindowed Functions
  • 我对大小写做了类似的事情,但它给了我错误的结果,例如当用户在“时间被占用”列中有值 1,2,2 如果我尝试使用 MAX() 它给出 2只有一次,但这不是我想要的,它应该给 2 两次。我不明白 CTE 在这里应该如何帮助我。据我了解 CTE 它是某种嵌套表,我也尝试使用它并且我只接收具有最大值的客户,而我需要它们。

标签: sql sql-server


【解决方案1】:

如果您采用您已经创建的确切视图,将其包装在 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2010-11-06
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多