SUM 行、返回计数和按日期排序
Posted
技术标签:
【中文标题】SUM 行、返回计数和按日期排序【英文标题】:SUM rows, return count and order by date 【发布时间】: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 天的总和? 发布示例数据和您希望从查询中得到什么的示例。 【参考方案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】:在结果中只返回单行的查询上使用top
或order 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 部分中。
希望这会有所帮助。
【讨论】:
以上是关于SUM 行、返回计数和按日期排序的主要内容,如果未能解决你的问题,请参考以下文章