繁体   English   中英

SQL计数查询。 偶数奇数

[英]SQL Count query. Even numbers odd numbers

我有一个产品表,我需要知道表中的记录数。 目标是将返回查询分为2个单独的查询。

If (Count(*) % 2) = 0 return top(Count(*) / 2)
else return top((Count(*) / 2) + 1)

主要查询是:

select coalesce(Price, ProductPrice) as Price, Product.ProductName, Customer.CustomerName, Product.CatalogNum from Product 
        inner join Customer on CustomerID = @custId
        left outer join CustomerPrice on dbo.Customer.CustomerID = dbo.CustomerPrice.CustomerID 
        and dbo.Product.ProductID = dbo.CustomerPrice.ProductID
        Where Product.ProductActive = 1 Order by Product.CatalogNum

可能不是最佳解决方案,但这可能对您有用:

DECLARE @Rows INT
SELECT @Rows = CASE WHEN COUNT(*) % 2 = 0 THEN COUNT(*)/ 2 ELSE COUNT(*) / 2 + 1 END FROM Table1
SET ROWCOUNT @Rows
SELECT * FROM Table1 
SET ROWCOUNT 0
DECLARE @a FLOAT
SET @a = (SELECT CEILING(COUNT(*)/2.0) FROM users)

SELECT TOP (CAST(@a AS INT)) * FROM users
DECLARE @Count int
SELECT @Count = COUNT(*) FROM SomeTable
SET @Count = CASE WHEN @Count % 2 = 0 THEN @Count / 2 ELSE @Count / 2 + 1 END
SELECT TOP(@Count) * FROM SomeTable ORDER BY SomeColumn

请注意,这里存在一个并发问题-第一条和第二条选择语句之间的行数可能会发生变化,除非您应用适当的限制性锁定提示/事务隔离级别。

还要注意, ORDER BY对于赋予“上半部分”任何含义都是必不可少的。

有关TOP子句的信息。

要获得下半部分,请执行相同的操作,但是如果计数为奇数,则减去一个,然后将排序顺序反转几次。

DECLARE @Count int
SELECT @Count = COUNT(*) FROM SomeTable
SET @Count = CASE WHEN @Count % 2 = 0 THEN @Count / 2 ELSE @Count / 2 - 1 END
SELECT * FROM (
    SELECT TOP(@Count) * FROM SomeTable ORDER BY SomeColumn DESC) AS Data
ORDER BY SomeColumn

尝试:

 Select * From Table t
 Where (Select Count(*) From Table
        Where pkCol < t.PkCol) <=
       (Select Count(*)+1 From Table)/2

整数除法应该处理您要使用的模运算符...

通过下面的注释来解决缺乏理解的问题,如果表的记录数为偶数,例如20,则count(*) = 20Count(*) + 1 = 21(Count(*)+1) / 2 = 10 ,查询将返回所有记录,其中pk小于其pk的记录的计数小于或等于10,即记录的一半。

如果有奇数个记录,例如21,则count(*) = 21Count(*) + 1 = 22 ,并且(Count(*)+1) / 2 = 11 该查询将返回所有记录,其中pk小于pk的pk计数小于或等于11,即一半的记录加一,与使用模运算符的操作相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM