以下是ERD图
问题:
提供一份报告,显示2011年7月至2012年6月期间销售额最高的10位艺术家。不要在销售中包含任何视频曲目。显示艺术家的名称和当年的总销售额。如果有任何关系,请包括10日的关系。
预期结果:
查询我到目前为止已写过
SELECT TOP(10) A.Name AS [Artist Name],
SUM(I.Total) AS [Total Sales]
FROM Artist AS A
JOIN Album AS AL
ON A.ArtistId = AL.ArtistId
JOIN Track AS T
ON AL.AlbumId = T.AlbumId
JOIN InvoiceLine AS IL
ON T.TrackId = IL.TrackId
JOIN Invoice AS I
ON I.InvoiceId = IL.InvoiceId
WHERE T.MediaTypeId != 3 and I.InvoiceDate BETWEEN '2011-07-01' AND '2012-06-30'
GROUP BY A.Name
ORDER BY SUM(I.Total) DESC;
结果
的问题:
1)如您所见,第2行和第3行与预期结果不匹配。数据库你可以download from here。
2)我无能为力"如果有的话,包括10日的关系。",有什么建议吗? DENSE_RANK有用吗?
注意:T.MediaTypeId != 3
表示销售中不包含视频曲目。
P.S。:这是任务,我不是要求解决方案来获得答案。我已经尝试了很多不同的解决方案来实现预期的结果,但失败了。我想知道我做错了什么。
答案 0 :(得分:0)
您可以使用WITH TIES
select top 10 with ties
https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-2017
此外,您正在使用BETWEEN
两个日期,这不会像您预期的那样有效,因为您的日期范围的上限将是午夜,您将丢失该最后一天的所有信息。请改用此语法:
and I.InvoiceDate >='2011-07-01' AND I.InvoiceDate <'2012-07-01'