SQL报告 - TOP n - 允许重复

时间:2018-06-01 04:29:42

标签: sql sql-server

以下是ERD图

ERD

问题:

提供一份报告,显示2011年7月至2012年6月期间销售额最高的10位艺术家。不要在销售中包含任何视频曲目。显示艺术家的名称和当年的总销售额。如果有任何关系,请包括10日的关系。

预期结果:

Sample Result

查询我到目前为止已写过

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;

结果

Actual Result

的问题:

1)如您所见,第2行和第3行与预期结果不匹配。数据库你可以download from here

2)我无能为力"如果有的话,包括10日的关系。",有什么建议吗? DENSE_RANK有用吗?

注意:T.MediaTypeId != 3表示销售中不包含视频曲目。

P.S。:这是任务,我不是要求解决方案来获得答案。我已经尝试了很多不同的解决方案来实现预期的结果,但失败了。我想知道我做错了什么。

1 个答案:

答案 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'