5

これはクエリの例です:

payment_Type    payment_value       cost_type      cost value
Cost I          100                 Registration       40
Cost I          100                 books              40
Cost I          100                 Lab                40

COST I にCost_Typeは、独自のを持つ 3 つの要素がありCost_valueます。

私はこのように操作したい:

payment_Type    payment_value       cost_type      cost value     Payment_by_cost_type
Cost I          100                 Registration       40              40
Cost I          100                 books              40              40
Cost I          100                 Lab                40              20

payment_valueをそれぞれに分けたいのがポイントですcost_value。例ではpayment_by_cost、40、40、20 = 100 になります。

ラボcost_valueは 40 ですが、上記の分割 2 コスト タイプから残っているため、割り当て可能な値は 20 です。

Payment_by_cost_type次の行レコードの値を使用することはできますか? 値を一時テーブルに挿入しようとしましPayment_by_cost_typeたが、選択に挿入ステートメントを含めることはできません。

これを解決する方法について誰かアイデアがありますか? 私はDWHに相談しており、クエリでは実行できないストアプロシージャを使用する必要があると彼は言いました。

4

4 に答える 4

2

テーブルには「Cost I」だけでなく他の値も含まれていると思いますので、テーブル内のすべてのグループ (Payment_type ごと) の結果を出力するクエリを次に示します。

;with table1 as
(select 
t.*,
row_number() 
 OVER 
(PARTITION BY payment_Type order by cost_type) rn
from t
)
,table2 as
( select t4.*,isnull((select sum(cost_value) from table1 
    where table1.payment_type=t4.payment_type and rn<t4.rn),0) CumSum 
  from table1 t4
) 
select payment_type,payment_value,cost_type,cost_value,
case when cost_value+CumSum<=payment_value then cost_value
  else 
    payment_value-Cumsum                  
  end                     

from table2
order by Payment_type,rn;

SQLFIDDLE デモ

于 2012-11-30T12:30:12.753 に答える
1
SELECT payment_Type, payment_value, cost_type, cost_value,
       CASE WHEN ROW_NUMBER() OVER (ORDER BY(SELECT 1)) = COUNT(*) OVER (PARTITION BY payment_Type)
            THEN SUM(cost_value) OVER (PARTITION BY payment_Type) - payment_value 
            ELSE cost_value END AS Payment_by_cost_type
FROM dbo.your_table

SQLFiddle のデモ

于 2012-11-30T16:32:34.667 に答える
1

支払いを適用する順序を定義するには、レコードに何らかの順序を定義する必要があります

それが済んだら (この例では ID を使用しています)...

select *
    , case
          when payment_value-(select isnull(SUM(cost_value),0) from yourtable t2 where t2.id<t1.id)<cost_value
          then payment_value-(select isnull(SUM(cost_value),0) from yourtable t2 where t2.id<t1.id)
          else cost_value
          end
from yourtable t1
于 2012-11-30T11:24:52.193 に答える
1

共通テーブル式を使用して段階的に実行します。

declare @t table (
payment_type varchar(20),
payment_value int,
cost_type varchar(20),
cost_value int,
cost_id int --for the ordering
)

insert @t values 
('Cost I',100,'Registration',40,1),
('Cost I',100,'books',40,2),
('Cost I',100,'Lab',40,3),
('Cost 2',100,'Registration',40,4),
('Cost 2',100,'books',50,5),
('Cost 2',100,'Lab',40,6)

--get count for each payment_type to determine last row
;with payment_value_cte(payment_type,payment_value,count) as
(
    select payment_type,payment_value,COUNT(*) from @t group by payment_type,payment_value
),
--use sequential index for each row in payment type
payment_value_index_cte(
    payment_type ,
    payment_value,
    cost_type,
    cost_value,
    cost_id,
    row) as
(
    select *,ROW_NUMBER() OVER(PARTITION BY payment_type ORDER BY cost_id) from @t --assumes order is by an id
),
--get sum of each row for payment type except last row
payment_value_sum_except_last_cte(
    payment_type,
    payment_value,
    current_sum) as
(
    select pi.payment_type,pi.payment_value,SUM(cost_value) 
    from payment_value_index_cte pi
    inner join payment_value_cte pt on pt.payment_type = pi.payment_type
    where pi.row < pt.count
    group by pi.payment_type,pi.payment_value
)
select 
pi.payment_type,pi.payment_value,pi.cost_type,pi.cost_value,
--if last row calculate difference, else use the cost_value
case when pi.row = pt.count then pt.payment_value - pe.current_sum else pi.cost_value end [Payment_by_cost_type]   
from payment_value_index_cte pi
inner join payment_value_cte pt on pt.payment_type = pi.payment_type
inner join payment_value_sum_except_last_cte pe on pe.payment_type = pi.payment_type
于 2012-11-30T11:59:26.473 に答える