2016-08-16 12 views
-1

私は様々な製品の取引テーブルを持っています。私はグループの製品に基づいており、各製品のすべての日に私に増分利益を与えることができますSQLクエリを作成することができ、各SQL - 同じテーブルを結合して最後のエントリの利益を計算する

Product    Date   Profit  Incremental Profit 
--------------------- --------------------------- ----------- 
Apple     2016-05-21  100 
Banana    2016-05-21  60 
Apple     2016-06-15  30 
Apple     2016-08-20  10 
Banana    2016-08-20  5 

に作られた利益を計算します。たとえば、最初の日付なので21-05-2015で、増分利益は0になりますが、15-06-2016では-70(30-100)になります。

予想される出力は次のようになります。

Product    Date   Profit  Incremental Profit 
    --------------------- --------------------------- ----------- 
    Apple     2016-05-21  100 0 
    Banana    2016-05-21  60  0 
    Apple     2016-06-15  30  -70 
    Apple     2016-08-20  10  -20 
    Banana    2016-08-20  5  -55 
+1

を同様に期待された結果を追加します。 (コピー、貼り付け、調整!) – jarlh

+0

行は常にデータでソートされていますか?私はちょうど最後のエントリを取ることができ、最後のエントリを日付で探すことはできないのですか? – Whencesoever

+0

@jarlh予想される出力表を追加しました。 – Swati

答えて

0

多分uはこれを使用することができます。

select 
    a.product 
    ,a.date 
    ,a.profit 
    ,isnull(a.profit - (select top 1 x.profit from profit x where x.product = a.product and x.date < a.date),0) as profit 
from PROFIT a 
order by product, date 
0

この

DECLARE @Tbl TABLE (Product NVARCHAR(50), Date_ DATETIME, Profit INT) 
INSERT INTO @Tbl 
VALUES 
('Apple' ,    '2016-05-21',  100), 
('Banana',   '2016-05-21',  60), 
('Apple',    '2016-06-15',  30), 
('Apple',    '2016-08-20',  10), 
('Banana',   '2016-08-20',  5 ) 


;WITH CTE 
AS 
( 
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Date_) RowId 
    FROM @Tbl 

) 


SELECT 
    CurrentRow.Product , 
    CurrentRow.Date_ , 
    CurrentRow.Profit , 
    CurrentRow.Profit - ISNULL(PrevRow.Profit, CurrentRow.Profit) 'Incremental Profit' 
FROM 
    CTE CurrentRow LEFT JOIN 
    (SELECT CTE.Product ,CTE.Profit, CTE.RowId + 1 RowId FROM CTE) PrevRow ON CurrentRow.Product = PrevRow.product AND 
                       CurrentRow.RowId = PrevRow.RowId 
ORDER BY CurrentRow.Date_ 

結果試してみてください。

Product  Date_  Profit Incremental Profit 
Apple  2016-05-21 100  0 
Banana  2016-05-21 60  0 
Apple  2016-06-15 30  -70 
Apple  2016-08-20 10  -20 
Banana  2016-08-20 5  -55 

編集:

UPDATE @Tbl 
SET [Incremental Profit] = A.[Incremental Profit] 
FROM 
(
    SELECT 
     CurrentRow.Product , 
     CurrentRow.Date_ , 
     CurrentRow.Profit , 
     CurrentRow.Profit - ISNULL(PrevRow.Profit, CurrentRow.Profit) 'Incremental Profit' 
    FROM 
     (SELECT *, ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Date_) RowId FROM @Tbl) CurrentRow LEFT JOIN 
     (SELECT *, ROW_NUMBER() OVER (PARTITION BY Product ORDER BY Date_) + 1 RowId FROM @Tbl) PrevRow ON CurrentRow.Product = PrevRow.Product AND 
                              CurrentRow.RowId = PrevRow.RowId 
) A 
WHERE 
    [@Tbl].Product = A.Product AND 
    [@Tbl].Date_ = A.Date_ 
+0

感謝しています。これは機能します。ここで選択するのではなく、これを既存のテーブルに更新することは可能ですか? – Swati

+0

@スワティはい、あなたのテーブルで '@ Tbl'を変更します – NEER

+0

はい私はテーブルを変更しましたが、レコードをどのように更新しますか?私は、更新構文がクエリ内にある必要があると思います。したがって、Tblに 'IncrementalProfit'という列があると仮定すると、このクエリの変更は何になりますか。お詫び申し訳ありませんが、私はSQLに新しいですし、あなたのソリューションは少し複雑です:) – Swati

関連する問題