【问题标题】:SUM rows, return count and order by dateSUM 行、返回计数和按日期排序
【发布时间】:2009-05-21 16:41:44
【问题描述】:

抱歉,这个查询卡住了,因为我在 order by 子句中有数据,它告诉我必须放入聚合或 group by 子句? (即使我不需要那个合计值?)。

表用户数据(用户 ID、销售额、信用、创建日期)

我的查询必须返回最后 10 个结果:

选择 TOP 10 COUNT(*) 作为 totalDays、SUM(sales)、SUM(credits) 来自用户数据 WHERE 用户 ID = @userID ORDER BY dateCreated DESC

我有 totalDays 因为它可能不会返回我要求的天数(在本例中为 10,但可以稍后更改)。

【问题讨论】:

  • 所以您只希望过去 10 天的总和?
  • 发布示例数据和您希望从查询中得到什么的示例。

标签: sql-server


【解决方案1】:

这将为您提供过去 10 天的总数:

SELECT
    COUNT(*) as totalDays, SUM(sales), SUM(credits) 
FROM 
    UserData 
WHERE 
    userID = @userID 
    AND DateCreated > GETDATE() - 10

最近 10 次销售

SELECT COUNT(*) as totalDays, SUM(sales), SUM(credits) 
FROM
    (SELECT TOP 10 sales, credits
    FROM UserData 
    WHERE userID = @userID 
    ORDER BY dateCreated DESC) X

【讨论】:

  • 这仅在您假设每天只发生一次销售时才有效。我认为 OP 想要最后 10 次销售,而不是最后 10 天的销售额
  • 不,这将收集过去 10 天内所有记录的总数
【解决方案2】:

在结果中只返回单行的查询上使用toporder by 是没有意义的。首先,您必须使查询返回多于一行才能使用它们。

这将简单地汇总所有销售额并返回一行,因此您必须先对其进行处理:

select count(*) as totalDays, sum(sales), sum(credits)
from UserData
where userID = @userID

如果要对最后十个销售额进行汇总,则需要一个子查询,先将这十个销售额隔离出来,然后再聚合:

select count(*) as totalDays, sum(sales), sum(credits)
from (
   select top 10 sales, credits
   from UserData
   where userID = @userID
   order by dateCreated desc
) LastData

如果你想总结最近十天的每一天的回报,你需要按日期分组:

select top 10 count(*) as totalDays, sum(sales), sum(credits)
from UserData
where userID = @userID
group by dateCreated
order by dateCreated desc

【讨论】:

    【解决方案3】:

    发生这种情况是因为 * (ALL) 字段。 由于您进行聚合,您应该选择另一个字段进行计数,任何字段都可以在您的情况下执行,这会使您的查询如下所示:

    选择 TOP 10 COUNT(USERID) 作为 TOTALDAYS、SUM(SALES)、SUM(CREDITS) 来自用户数据 WHERE 用户 ID = @userid GROUP BY 创建日期 ORDER BY datecreated DESC

    即使在 SELECT 子句中没有使用 datecreated,它仍然需要在 GROUP BY 部分中。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多