2016-09-01 14 views
0

NTILE()を使用して項目のセットにグループ化IDを提供しようとしています。基本的には、4つのアイテムはすべて同じGroupIDでグループ化する必要があります。問題は、IDごとに行の総数が異なることです。これは可能ですか?NTILE SQL関数の動的パラメータ

SELECT 
ProductDescription AS LabelType1, 
NTILE(FLOOR(COUNT(bc.Groupings)/4)) OVER (ORDER BY s.OrderId) AS GroupNumber, 
Barcode AS Barcode1 
FROM 
dbo.table1 s 
INNER JOIN 
#BoxCounts bc ON s.OrderId = bc.OrderId 
+0

サンプルデータと予想される結果を追加することもできますか? –

+0

私は通常、row_numberとdivide、またはNTILEではなく%を使用します。とにかくNTILEはうまくいきません。 http://sqlfiddle.com/ – SQLMason

+1

を設定することを検討してください。あなたが探しているものを 'ROW_NUMBER()OVER(ORDER BY s.OrderID)/ 4'と思っています。私が質問/意図を完​​全に誤解していない限り。 –

答えて

0

(彼は質問に答えていないので)これはベンThulさんのコメントに精緻です。

NTILE()は、行のセットをnとほぼ同じサイズのグループに分割します。 nは定数です。

固定数の行にグループ化IDを割り当てたいとします。これは別の問題で、row_number()またはrank()で簡単に処理できます。

だから、一つの方法である:

SELECT ProductDescription AS LabelType1, 
     (ROW_NUMBER() OVER (ORDER BY s.OrderId) - 1)/4 as GroupNumber, 
     Barcode AS Barcode1 
FROM dbo.table1 s INNER JOIN 
    #BoxCounts bc 
    ON s.OrderId = bc.OrderId; 

注計算で- 1、第1のグループは、4つの要素を有します。また、SQL Serverでは整数の除算が行われるため、小数点以下の桁数を気にする必要はありません。

あなたはネクタイを持っており、同じOrderIdを持つすべての行が同じグループになりたい、あなたはすべてのグループが持つようにしたい場合は、その後dense_rank()(あなたはすべてのグループは、4つの異なる順序IDを持つようにしたい場合)またはrank()を(使うことができれば約4桁のID)。

+0

非常に参考になりました、ありがとうございます。それは素晴らしい仕事です。 –

関連する問題