0

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

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 
+0

如果您只需要表中的记录数,您可以执行'SELECT COUNT(*)FROM productTable'。但我不认为我理解你的问题...... – jadarnel27

+0

所以,你要表的上半部分,如果行数是偶数,上半部分(舍去),加上一行,如果行数是奇数;是对的吗?哪个版本的SQL服务器? –

+0

Daniel Renshaw - 正是我的需要。 SQL Server Express 2008 r2 – Kulpemovitz

回答

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 

注意,这里有一个并发的问题 - 行数可能,除非你申请适当限制锁定提示/事务隔离级别的第一和第二选择语句之间变化。

还要注意的ORDER BY是必不可少给予任何意义“上半部”。

For information on the TOP clause.

要获得下半部做相同的,但减去一个,如果奇数和反向排序几次。

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 
+0

我不需要担心并发。 – Kulpemovitz

+0

这很好。我如何获得下半年的产品? – Kulpemovitz

+0

@Kulpemovitz查看更新的答案,获取下半部分 –

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 
+0

ROWCOUNT确定要提取的记录数量还是只告诉你提取了多少记录? –

+0

SET ROWCOUNT限制返回的行数,而@@ ROWCOUNT告诉你有多少被退回。 – PaulStock

+0

哦,好的。然后这工作。不过,我还是很喜欢我的更好:) –

0

尝试:

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

的整数除法应该处理你的一个再rtying做模运算符...

,以解决缺乏通过下面的评论理解,如果表中有偶数的记录,说20,然后count(*) = 20Count(*) + 1 = 21(Count(*)+1)/2 = 10,查询将返回pk小于pk的记录数小于或等于10的所有记录,即记录的一半。

如果有奇数个记录,比如说21,那么count(*) = 21Count(*) + 1 = 22(Count(*)+1)/2 = 11。查询将返回所有记录的一个PK记录的计数小于它的PK小于或等于11,即一半的记录加一,一样的使用模运算符会做。

+0

整数除法是不会帮助你在这里,我一般不明白你的答案。 –

+0

@MK,如果你不懂整数除法,那么......2/2 = 1; 3/2 = 1; 4/2 = 2; 5/2 = 2; –

+0

啊,我仍然不明白你的答案,但部门现在有意义。 –

1
DECLARE @a FLOAT 
SET @a = (SELECT CEILING(COUNT(*)/2.0) FROM users) 

SELECT TOP (CAST(@a AS INT)) * FROM users 
+0

SQL 2008能让你像这样使用TOP变量吗?我知道SQL 2005不会允许它。如果是这样,那个方法比我的答案好得多。 – PaulStock

+0

我在2005年进行了测试。您需要将其放在括号内。 –

+0

你说得对。好的,我也更喜欢你的答案。 – PaulStock