Запрос SQL Count. Четные числа нечетные числа - PullRequest
0 голосов
/ 30 августа 2011

У меня есть таблица продуктов, мне нужно знать количество записей в таблице. Цель состоит в том, чтобы разделить запрос возврата на 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 ]

1 голос
/ 30 августа 2011
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
1 голос
/ 30 августа 2011
DECLARE @a FLOAT
SET @a = (SELECT CEILING(COUNT(*)/2.0) FROM users)

SELECT TOP (CAST(@a AS INT)) * FROM users
1 голос
/ 30 августа 2011

Вероятно, не самое оптимальное решение, но это может работать для вас:

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 голосов
/ 30 августа 2011

Попробуйте:

 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 меньше или равнодо 10, то есть половина записей.

Если существует нечетное количество записей, скажем, 21, то count(*) = 21, Count(*) + 1 = 22 и (Count(*)+1) / 2 = 11.запрос вернет все записи, в которых количество записей с pk меньше его pk меньше или равно 11, т. е. половина записей плюс одна, то же самое, что и при использовании оператора модуля.

...