【问题标题】:Get Avg to work together with count in group by SQL clause通过 SQL 子句获取 Avg 以与 count in group 一起工作
【发布时间】:2015-02-10 10:37:33
【问题描述】:

我有一个如下所示的 SQL 子句:

SELECT TOP 1000 ir.ItemID, it.Title, count(ir.ItemID) as amount
  FROM [eboghandel].[dbo].[ItemReviews] ir
  LEFT JOIN Items it on ir.ItemID = it.ID
  group by ItemID, it.Title
  order by amount desc

这很好用,我得到了一个包含最多评论的项目列表。

不过,我还想显示这个分数的“平均”评分。

我可以轻松做到:

  SELECT Avg(Rating) FROM ItemReviews WHERE ItemID = '5324181'

这将给出我的平均值,但我想将其与上一个查询结合起来。

我试过了:

SELECT TOP 1000 ir.ItemID, it.Title, count(ir.ItemID) as amount, avg(ir.Rating)
  FROM [eboghandel].[dbo].[ItemReviews] ir
  LEFT JOIN Items it on ir.ItemID = it.ID
  group by ItemID, it.Title, ir.Rating
  order by amount desc

但是这个有两个问题。

  • 计算错误(咳咳)
  • 似乎删除了一些评论,所以计数不同

知道如何修复这个 SQL 调用吗?

【问题讨论】:

  • 我认为你不能将两者结合在一个 select 语句中,因为在你的第一个 select 语句中你有 1000 行(前 1000 行),而第二个语句是平均值,你只有 1 行。将两者结合起来肯定会给你一个错误的结果。
  • 或者除非你可以平均重复 1000 次。
  • 分组依据时,列应在 GROUP BY 中指定,或作为聚合函数的参数(count、avg 等)! (如果两者都有,您将获得特定值的平均值,即该特定值...)

标签: sql sql-server group-by aggregate-functions


【解决方案1】:

我认为使用公用表表达式可以帮助您解决问题。下面写的是未经测试的代码,您也许可以按照相同的思路写一些东西。

;with cte
as
(
SELECT TOP 1000 ir.ItemID item_id, it.Title title, count(ir.ItemID) as amount
  FROM [eboghandel].[dbo].[ItemReviews] ir
  LEFT JOIN Items it on ir.ItemID = it.ID
  group by ItemID, it.Title
)
select item_id, title, amount, avg(rating) from cte join ItemReviews ir
on cte.item_id=ir.id
group by item_id, title, amount
order by amount

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多