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 @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

ここには同時実行の問題があることに注意してください。適切に制限されたロック ヒント/トランザクション分離レベルを適用しない限り、最初と 2 番目の select ステートメントの間で行数が変わる可能性があります。

ORDER BY「上半分」に何らかの意味を与えるには、 an が不可欠であることにも注意してください。

TOP条項に関する情報については。

下半分を取得するには、同じことを行いますが、カウントが奇数の場合は 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 * FROM (
    SELECT TOP(@Count) * FROM SomeTable ORDER BY SomeColumn DESC) AS Data
ORDER BY SomeColumn
于 2011-08-30T19:40:40.260 に答える
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 に答える
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(*) = 21、 、Count(*) + 1 = 22、および(Count(*)+1) / 2 = 11. クエリは、その pk より小さい pk を持つレコードの数が 11 以下のすべてのレコードを返します。つまり、モジュラス演算子の使用と同じように、レコードの半分に 1 を加えたものです。

于 2011-08-30T19:22:36.040 に答える