sql-server - 聚合内的聚合
问题描述
我正在尝试在单个 select 语句中使用多个聚合,但我被困在一个基于另一个聚合的值上(总收入是通过乘以 来计算COUNT(TrackID)
的Unit Price
)。
我不允许进行 CTE,并且尝试使用子查询失败。三个注释掉的行是我失败的尝试(不是子查询的失败尝试,我已经删除了那些)。
SELECT C.Country
,Ar.Name AS 'Artist Name'
,COUNT(T.TrackId) AS 'Track Count'
,COUNT(DISTINCT T.Name) AS 'Unique Track Count'
,COUNT(T.TrackID) - COUNT(DISTINCT T.Name) AS 'Count Difference'
--,POWER(IL.UnitPrice,COUNT(T.TrackId)) AS 'Test'
--,SUM(IL.UnitPrice * COUNT(T.TrackID)) AS 'Total Revenue'
--,IL.UnitPrice * COUNT(T.TrackID) AS 'Total Revenue'
,CASE MediaTypeId
WHEN 3
THEN 'Video'
ELSE 'Audio'
END AS MediaType
FROM Artist Ar
JOIN Album Al
ON Al.ArtistId = Ar.ArtistId
JOIN Track T
ON T.AlbumId = Al.AlbumId
JOIN InvoiceLine Il
ON Il.TrackId = T.TrackId
JOIN Invoice I
ON I.InvoiceId = Il.InvoiceId
JOIN Customer C
ON C.CustomerId = I.CustomerId
GROUP BY Ar.Name
,C.Country
,CASE MediaTypeId
WHEN 3
THEN 'Video'
ELSE 'Audio'
END
ORDER BY C.Country ASC, COUNT(T.TrackID) DESC, Ar.Name ASC
我也试过这个,但结果被遗漏了
SELECT C.Country
,Ar.Name AS 'Artist Name'
,COUNT(T.TrackId) AS 'Track Count'
,COUNT(DISTINCT T.Name) AS 'Unique Track Count'
,COUNT(T.TrackId) - COUNT(DISTINCT T.Name) AS 'Count Difference'
,CASE MediaTypeId
WHEN 3
THEN 'Video'
ELSE 'Audio'
END AS MediaType
,T2.TotalRevenue
FROM Artist Ar
JOIN Album Al
ON Al.ArtistId = Ar.ArtistId
JOIN Track T
ON T.AlbumId = Al.AlbumId
JOIN InvoiceLine Il
ON T.TrackId = Il.TrackId
JOIN Invoice I
ON I.InvoiceId = Il.InvoiceId
JOIN Customer C
ON C.CustomerId = I.CustomerId
JOIN (SELECT T.TrackId, SUM(Il.TrackId * Il.UnitPrice) AS 'TotalRevenue'
FROM Track T
JOIN InvoiceLine Il
ON T.TrackId = Il.InvoiceId
GROUP BY T.TrackId) T2 ON T.TrackId = T2.TrackId
GROUP BY C.Country
,Ar.Name
,CASE MediaTypeId
WHEN 3
THEN 'Video'
ELSE 'Audio'
END
,T2.TotalRevenue
ORDER BY C.Country ASC, COUNT(T.TrackID) DESC, Ar.Name ASC
解决方案
您不能在计算中使用聚合或在同一查询的聚合中使用聚合,您需要将查询包装为内部查询并在外部查询中使用聚合进行计算,如下所示 -
Select [columnsNames], [aggregates]
From
(
Your Inner Query
)a
Group By [columnsNames]
Order By [columnsNames]
推荐阅读
- css - 如何使 ag-grid 中的单元格内容垂直居中?
- java - 为什么@PathVariable 会修剪包含# 的数据?
- rsa - 在 ESP32 上使用 RSA 加密消息
- microsoft-graph-api - 从 Microsoft Team Channel 中的本地系统将文件/图像作为消息发送
- c# - 检索文件并使其成为可点击的格式以在新窗口中打开或可下载
- amazon-web-services - 从 EC2 实例中删除自定义域,然后将域用于 Cloud Run 应用程序(Route 53 中的域)
- c# - 如何在 .NET 中创建带有脱机文件(类似于 OneDrive)的虚拟文件系统?
- python - 在 Python 中重构字典的层次结构
- javascript - 当单击不同的 div 时,如何仅使用 CSS 和 JavaScript 淡入 div
- powershell - Set-Service:找不到与参数名称“凭据”匹配的参数