下面是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)如您所见,Row#2和Row# 3与预期结果不匹配。数据库你可以download from here。
2)我不知道如何做“包括10号领带,如果有。”,有什么建议吗?DENSE_RANK有帮助吗?
注意:T.MediaTypeId != 3
表示视频曲目不包括在销售中。
附言:这是作业,我并不是为了得到答案而寻求解决方案。我尝试了很多不同的解决方案来达到预期的效果,但都失败了。我想知道我做错了什么。
发布于 2018-06-01 15:17:42
部分答案,因为不包含样本数据:
您可以使用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'
https://stackoverflow.com/questions/50636117
复制相似问题