0

我有一个产品表,我需要知道表中的记录数。目标是将返回查询分为 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
4

4 回答 4

1

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

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
于 2011-08-30T19:21:46.210 回答
1
DECLARE @a FLOAT
SET @a = (SELECT CEILING(COUNT(*)/2.0) FROM users)

SELECT TOP (CAST(@a AS INT)) * FROM users
于 2011-08-30T19:33:41.497 回答
1
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

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

另请注意,anORDER 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
于 2011-08-30T19:40:40.260 回答
0

尝试:

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

整数除法应该处理你正在用模运算符做的事情......

为了解决以下评论缺乏理解的问题,如果表有偶数条记录,比如 20 条,那么count(*) = 20,Count(*) + 1 = 21(Count(*)+1) / 2 = 10, 查询将返回 pk 小于 pk 的记录数少于 pk 的所有记录或等于 10,即一半的记录。

如果有奇数条记录,比如 21 条,则count(*) = 21Count(*) + 1 = 22(Count(*)+1) / 2 = 11。查询将返回 pk 小于其 pk 的记录计数小于或等于 11 的所有记录,即一半的记录加 1,与使用取模运算符的情况相同。

于 2011-08-30T19:22:36.040 回答