我需要获得每篇文章的最后两次购买(并将其平均)并知道发现了多少次购买(有些可能没有,一次或多次)
我试图做这样的事情
select ArticleId, sum(cost*quantity)/sum(quantity) as AverageCost, count(PurchaseId)
where PurchaseId in (select top 2 * from PurchasesTable order by PurchaseDate)
from vsboremix.dbo.PurchaseTable join vsboremix.dbo.DocumentTable on pt.DocumentId=DocumentTable.DocumentId
Group by ArticleId
// I omitted some joins so as to simplify the query
// (I also need to bring in some tax/etc. values from separate tables)
我得到一个"当子查询未与EXISTS一起引入时,在选择列表中只能指定一个表达式。"错误,[已修复]但我不确定此查询是否是正确的方向,还是会有更简单或更好的方法来执行此操作?
对于文章我发现不到两次购买,我需要运行单独的查询来获取其他信息以调整其平均值,因此我还需要此查询以获取每个ArticleId是否存在是否有记录购买。
我还需要改进这个查询,因为我需要运行7个商店并且它们的值会有所不同[商店ID也会保存在相同的表格中购买日期],所以我必须运行此查询7次,子查询再运行7次。
有关修复错误或重构查询的任何建议都将不胜感激!
- [编辑]:我修复了错误,但查询只返回七个值,所有计数都是1(每个商店应该有19万个),因此查询的格式或子查询是错误的。
答案 0 :(得分:1)
假设您使用的是SQL Server(基于top
的使用),您可以使用窗口函数执行此操作:
select ArticleId, sum(cost*quantity)/sum(quantity) as AverageCost, count(ArticleId)
from (select pt.*,
row_number() over (partition by ArticleId order by PurchaseDate desc) as seqnum
from PurchaseTable pt
) pt
where seqnum <= 2
Group by ArticleId;