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】:

在结果中只返回单行的查询上使用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 部分中。

希望这会有所帮助。

【讨论】:

以上是关于SUM 行、返回计数和按日期排序的主要内容,如果未能解决你的问题,请参考以下文章

大数据之-HIVE入门(十二)

jdbc的executeBatch()返回正确的行计数

查询以返回连续 X 天内值的最低 SUM

日期和按日期排序时的postgresql案例

对超过百万行进行排序的分组

分组依据、IFNULL 和按日期排序