0

私はSQLServer2012を使用しており、次のテーブルがあります。

Tb1ID Int, CodeID Int, Value Int

 ID     CodeID    Value
 ----------------------
 1      1         10
 2      1         14
 3      1         5
 4      1         25
 5      2         12
 6      2         17
 7      2         4
 8      2         10
 9      2         6

Tb2CodeID Int Value Int

CodeID    Value
---------------
1         25
2         20

SUM(Tb1.Value)<=Tb2.ValueであるTb1からレコードを取得するためのクエリが必要です

たとえば、上記のレコードの結果は次のとおりです。

Tb1.ID   Tb1.CodeID  Tb1.Value   UsedValue     Tb2.Value
--------------------------------------------------------
1         1          10          10            25
2         1          14          14            25
3         1          5           1             25
5         2          12          12            20
6         2          17          8             20

クエリの上にカーソルを使用します。しかし、私のクエリは、パフォーマンスが低く実行されます。カーソルのないクエリが必要です。

編集 1UsedValueは、Tb1.Valueの合計がTb2.Valueよりも低くなるまで、Tb1.Valueです。

4

3 に答える 3

0

これを試して:

;WITH Subtotals
AS
(
  SELECT
    T1.Id, T1.CodeId, SUM(T2.Value) SubTotal  
  FROM Tb1 T1
    JOIN Tb1 T2
       ON T1.CodeId = T2.CodeId
         AND T1.Id >= T2.Id
  GROUP BY T1.Id, T1.CodeId
)
SELECT
    S.ID,
    S.CodeID,
    T1.Value,
    CASE WHEN T2.value >= S.Subtotal
         THEN T1.value
         ELSE T1.value - (S.Subtotal - T2.value)
    END UsedValue,
    T2.Value T2Value
FROM Subtotals S
   JOIN Tb2 T2
      ON S.CodeId = T2.CodeId
   JOIN Tb1 T1
      ON S.Id = T1.Id
WHERE T2.Value >= S.SubTotal - T1.Value

SQLFIDDLEで結果を見る

于 2013-01-20T08:56:59.353 に答える
0
select 
T.Id
, T.CodeId
, T.Value
, T.Value -(Total - T2.Value) as UsedValue
, T2.Value as T2_Value
from 
(
   select a.id
   , a.codeid
   , a.Value
   , sum(b.value) as Total
   from Tb1 a join Tb1 b 
   on a.Id >= b.id and a.CodeId = b.CodeId
   group by a.id, a.CodeId, a.Value
) T
join Tb2 T2 
on T.CodeId = T2.CodeId
where Total < (T2.Value + T.Value)

私がこのコードを書いたときの仮定は1つだけです。その行はIDで並べ替えられます。それが正しくない場合は、順序付け列を追加する必要があります。

于 2013-01-20T11:16:55.533 に答える
0
select id,codeid,value,case when vt>0 then value else value+vt end usedvalue, 
       value2 
from (select *, value2-runtot vt,
       max(case when value2-runtot<0 then value2-runtot else -runtot end) 
       over(PARTITION BY codeid)  usedvalue 
           from (SELECT t1.id, t1.codeid, t1.value, t2.value value2, 
                sum(t1.value) OVER(PARTITION BY t1.codeid ORDER BY t1.id) runtot
              FROM tb1 t1
              INNER JOIN tb2 t2 ON t1.codeid = t2.codeid
              ) X
             )Y
where vt>=usedvalue
于 2013-01-21T07:15:27.670 に答える