2011-12-29 20 views
2

私はこのようなテーブルを持っている:SQLクエリ(列の合計)

Product sl_no Wt_Kg 
Prod-001 1 3.000 
Prod-002 2 4.000 
Prod-003 3 2.000 
Prod-004 4 3.000 
Prod-005 5 6.000 
Prod-006 6 7.000 
Prod-007 7 1.000 
Prod-008 8 2.000 
Prod-009 9 3.000 
Prod-010 10 5.000 
Prod-011 11 2.000 
Prod-012 12 4.000 

私は、シーケンス番号からの指定された合計まで見つめて、このテーブルからすべてのレコードを必要とします体重(キログラム)に達する。 I場合、次の例で

Product sl_no Wt_Kg 
Prod-001 1 3.000 
Prod-002 2 4.000 
Prod-003 3 2.000 
Prod-004 4 3.000 
Prod-005 5 6.000 
Prod-006 6 7.000 

:私はより少ないまたは25キログラムに等しい重量の和を有するシリアル番号(Sl_no)1からすべての製品を取得したい場合、私は、次の結果を得るべきである。例えば
シリアル番号3および以下30kgsに等しい重みから見つめたすべての製品が欲しい、私は次のような結果が得られます。

Product sl_no Wt_Kg 
Prod-003 3 2.000 
Prod-004 4 3.000 
Prod-005 5 6.000 
Prod-006 6 7.000 
Prod-007 7 1.000 
Prod-008 8 2.000 
Prod-009 9 3.000 
Prod-010 10 5.000 

は、これを達成するために私を助けてください。事前のおかげで...

+0

は、固有のシリアル番号(sl_no)の場合、またはこのシリアル番号を持つ複数のレコードがあることができますか? –

+0

シリアル番号は一意です。 – Nagesh

答えて

3

この方が効率的かもしれません。あなたの記述にマッチするデータベースに_testというテーブルを作成することから始めました。この解決策は、UPDATEステートメント(http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx)の値をインクリメントする機能を利用します。目標値に達するとインクリメントが停止します。あなたは何百万もの製品を持っている場合、パフォーマンスが問題になりますが、あなたは(平均重量に基づく)製品の特定の数の中に、あなたの目標体重に到達し、テーブル変数内のレコードの最初の数を制限するSET ROW_COUNTを使用することを想定できました。

DECLARE @Weight   REAL 
DECLARE @SerialNumber  INT 
DECLARE @MaxWeight   REAL 

SET @Weight    = 0 
SET @SerialNumber   = 3 
SET @MaxWeight    = 30 

DECLARE @Results TABLE 
     (
     Product   CHAR(8), 
     sl_no    INT, 
     Wt_Kg    REAL, 
     Total_Wt   REAL 
     ) 

INSERT INTO 
     @Results 

(
     Product, 
     sl_no, 
     Wt_KG 
) 

SELECT 
     Product, 
     sl_no, 
     Wt_KG 

FROM 
     _test 

WHERE 
     sl_no >= @SerialNumber 

ORDER BY 
     sl_no 


UPDATE 
     @Results 

SET 
     @Weight = Total_Wt = Wt_Kg + @Weight 

WHERE 
     @Weight <= @MaxWeight 


SELECT 
     * 

FROM 
     @Results 

WHERE 
     Total_Wt <= @MaxWeight 

結果は以下のとおりです。

Product sl_no  Wt_Kg   Total_Wt 
-------- ----------- ------------- ------------- 
Prod-003 3   2    2 
Prod-004 4   3    5 
Prod-005 5   6    11 
Prod-006 6   7    18 
Prod-007 7   1    19 
Prod-008 8   2    21 
Prod-009 9   3    24 
Prod-010 10   5    29 
+1

こんにちはキース、この全体のことがビューを使用して行うことができますか?はいの場合は、その旨を書いてください。 – Nagesh

+0

いいえ、これはストアドプロシージャ内にある必要があります。 –

0

シリアル番号が一意である場合:

まず例:

select * 
from tableName 
where sl_no >= 1 
and Wt_Kg <= 25 

第二の例:

select * 
from tableName 
where sl_no >= 3 
and Wt_Kg <= 30 

シリアル番号が一意でない場合:

select Product, sl_no, Sum(Wt_Kg) 
from tableName 
where Wt_Kg <= 25 
group by Product, sl_no 

EDIT:あなたは合計値で結果をフィルタリングする場合

は、あなたはこれを試みることができる:

select Product, sl_no, Sum(Wt_Kg) 
from tableName 
group by Product, sl_no 
having (Sum(Wt_Kg) <= 25) 

製品場合はOR(合計よりもユニークsl_noあることに注意してください)んではありません特定の値を共有するレコードには、集約集合が使用されます。

+1

最後の1人でグループが必要です... – Ben

+0

編集した部分のグループ化は何も変わりません。 'sl_no'には複数の行がありませんので、' sl_no'の合計は 'Wt_Kg'の値を返します。 –

+0

最後のクエリはタイトルの下にもあります「シリアル番号が一意でない場合: –

1
declare @total decimal(9,3), @sl_no int 
select @total = 25.000, @sl_no = 0 -- first case 
--select @total = 30.000, @sl_no = 3 -- second case 

;with tab (Product, sl_no, Wt_Kg) as (
    select 'Prod-001', 1, 3.000 union all 
    select 'Prod-002', 2, 4.000 union all 
    select 'Prod-003', 3, 2.000 union all 
    select 'Prod-004', 4, 3.000 union all 
    select 'Prod-005', 5, 6.000 union all 
    select 'Prod-006', 6, 7.000 union all 
    select 'Prod-007', 7, 1.000 union all 
    select 'Prod-008', 8, 2.000 union all 
    select 'Prod-009', 9, 3.000 union all 
    select 'Prod-010', 10, 5.000 union all 
    select 'Prod-011', 11, 2.000 union all 
    select 'Prod-012', 12, 4.000 
) 
select t3.* 
from tab t3 
join (
    select t1.product, t1.sl_no, sum(t2.Wt_Kg) as total 
    from tab t1 
    join tab t2 on t1.sl_no >= t2.sl_no 
    where t2.sl_no >= @sl_no 
    group by t1.product, t1.sl_no 
) t on t.product = t3.product and t.sl_no = t3.sl_no 
where t.total <= @total 

追加さ:(productが一意でない場合にだけ場合)sl_noによってグループ化し、接合

結果は、最初のケースである:

Product sl_no Wt_Kg 
Prod-001 1 3.000 
Prod-002 2 4.000 
Prod-003 3 2.000 
Prod-004 4 3.000 
Prod-005 5 6.000 
Prod-006 6 7.000 

第二ケース:

Product sl_no Wt_Kg 
Prod-003 3 2.000 
Prod-004 4 3.000 
Prod-005 5 6.000 
Prod-006 6 7.000 
Prod-007 7 1.000 
Prod-008 8 2.000 
Prod-009 9 3.000 
Prod-010 10 5.000 
+0

こんにちは@Michal、優れたロジック、ありがとう。 – Nagesh

1

My solu

declare @total decimal(9,3), @sl_no int 
select @total = 25.000, @sl_no = 1 -- first case 


select * from Tab where sl_no<= 
(
    select MAX(sl_no3) from (
     select t3.sl_no sl_no3, sum(t3.Wt_kg) Wt_kg3 from (
      select t1.sl_no sl_no, t2.Wt_Kg as Wt_kg from Tab t1, Tab t2 where t1.sl_no>=t2.sl_no and t2.sl_no >[email protected]_no 
     ) t3 group by t3.sl_no having SUM(t3.Wt_kg) <= @total 
    ) t4 
) and sl_no>=$sl_no