首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL报告-允许前n个重复项

SQL报告-允许前n个重复项
EN

Stack Overflow用户
提问于 2018-06-01 12:29:42
回答 1查看 191关注 0票数 2

下面是ERD图

问题:

提供一份报告,显示从2011年7月到2012年6月销售最多的10位艺术家。请勿在销售中包含任何视频轨道。显示艺术家的姓名和该年的总销售额。如果有的话,包括10号的领带。

预期结果:

到目前为止我已经写过的查询

代码语言:javascript
运行
复制
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表示视频曲目不包括在销售中。

附言:这是作业,我并不是为了得到答案而寻求解决方案。我尝试了很多不同的解决方案来达到预期的效果,但都失败了。我想知道我做错了什么。

EN

回答 1

Stack Overflow用户

发布于 2018-06-01 15:17:42

部分答案,因为不包含样本数据:

您可以使用WITH TIES包含领带

代码语言:javascript
运行
复制
select top 10 with ties

https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-2017

此外,您正在使用具有两个日期的BETWEEN,这不会像您预期的那样工作,因为您的日期范围的上限将是午夜,您将丢失最后一天的所有信息。请改用以下语法:

代码语言:javascript
运行
复制
and I.InvoiceDate >='2011-07-01' AND I.InvoiceDate <'2012-07-01'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50636117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档