微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查询失败---按查询顺序选择count*,得到sqlserver错误8127

如何解决查询失败---按查询顺序选择count*,得到sqlserver错误8127

假设我在TableA中有如下数据

ID  TIME                    VAL
1   2020-10-01 12:00:12.000 test
2   2020-10-01 13:00:12.000 test2
3   2020-10-01 13:00:12.000 test2
4   2020-10-01 13:00:12.000 test2
5   2020-10-01 13:00:12.000 test2
6   2020-10-01 13:00:12.000 test2
7   2020-10-01 13:00:12.000 test2
8   2020-10-01 13:00:12.000 test2
9   2020-10-01 13:00:12.000 test2

我想按时间和限制偏移量对数据进行计数,我试图这样做

SELECT COUNT(*)
FROM TableA
WHERE TIME>'2020-10-01 00:00:00' AND TIME<'2020-10-01 23:59:59'
ORDER BY TIME ASC OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY

但是我得到一个错误

ORDER BY子句中的“ TableA.TIME”列无效,因为它既不在聚合函数中也不在GROUP BY子句中。

sql Server 2012下执行查询

如何使其正确?

我执行此过程的结果

我想统计一页的记录,并检查是否等于页面大小。然后决定再次查询真实数据并进行缓存。

假设数据已被一次一个添加,我想然后一页一页地统计数据,假设一页包含50条记录。因此,首先我必须按时间asc排序,然后按“偏移量限制”获取目标页面数量,而该数量等于redis缓存数据的数量,如果没有,我将从redis获取数据,这意味着插入一些新数据后,我将从db中获取数据,然后将新计数和新数据再次缓存到redis中。 所有数据都应按页面升序按时间升序排列,这意味着最后一页的计数将更改,因此我需要执行此类查询以检查一页的实际计数。

解决方法

查询的开始使我们认为您希望获得一个输出,该输出是两个日期之间表中所有项目的计数:

SELECT COUNT(*)
FROM TableA
WHERE TIME>'2020-10-01 00:00:00' AND TIME<'2020-10-01 23:59:59'

但是查询的其余部分使我们认为您想要获取过滤后的元素的前50个元素:

ORDER BY TIME ASC OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY

如果要计数,请仅保留第一部分:

SELECT COUNT(*)
FROM TableA
WHERE Time BETWEEN '2020-10-01 00:00:00' AND '2020-10-01 23:59:59'

如果要获得结果,请删除计数:

SELECT *
FROM TableA
WHERE Time BETWEEN '2020-10-01 00:00:00' AND '2020-10-01 23:59:59'
ORDER BY TIME ASC OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY
,

我认为您可以这样做:

SELECT COUNT(*)
    from(
    select *
    FROM TableA
    WHERE TIME>'2020-10-01 00:00:00' AND TIME<'2020-10-01 23:59:59'
    ORDER BY TIME ASC OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY
    ) as x

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。