久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

SQL Server 根據不同的標志計算累積總和/條件運行

SQL Server Calculate cumulative sum / conditional running total depending on different flags(SQL Server 根據不同的標志計算累積總和/條件運行總和)
本文介紹了SQL Server 根據不同的標志計算累積總和/條件運行總和的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我在 SQL Server 中有一個表,其中的數據類似于此示例.

I have a table in SQL Server with data looking like this example.

ID  Flag    Art.No  Amount
1   U   A1000   -100
2   U   B2000   -5
3   V   B2000   900
4   U   B2000   -10
5   I   B2000   50
6   U   B2000   -20
7   U   A1000   -50
8   I   A1000   1000
9   V   A1000   3600
10  U   A1000   -500
11  U   A1000   -100
12  U   A1000   -2000
13  I   A1000   2000
14  U   A1000   -1000
15  I   C3000   10000
16  U   C3000   -4000
17  U   B2000   -5
18  U   B2000   -5
19  I   B2000   40
20  V   B2000   200
21  U   A1000   -500
22  U   B2000   -50
23  U   C3000   -1000

我想根據交易計算累積價值.我的問題是該表包含 3 種類型的交易.

I want to calculate ackumulated value based on the transactions. My problem is that the table contains 3 types of transactions.

  1. 標記 U - 銷售
  2. Flag I - 進貨
  3. Flag V - 盤點

當標志 U 和 I 出現時,數量代表變化出現Flag V時數量代表盤點時的總量

When Flag U and I appears the amount represent the change When Flag V appears the amount represent the total amount when stocktaking

換句話說,我想找到每個 unice Art.No 的最新 V-transaction,然后添加或減去 U 和 I 交易以獲得每行的累計總和.如果沒有 V-transaction 則遍歷整個數據集.

In words I want to find the latest V-transaction for each unice Art.No and then add or subtract U and I transactions to get a cummulativ sum for each row. If there is no V-transaction go through the whole dataset.

我已經為每個藝術制作了具有預期結果的示例.No

I have made examples with expected result for each Art.No

A1000

ID  Flag    Art.No  Amount  A1000 Example
1   U   A1000   -100    
7   U   A1000   -50 
8   I   A1000   1000    
9   V   A1000   3600    3600
10  U   A1000   -500    3100
11  U   A1000   -100    3000
12  U   A1000   -2000   1000
13  I   A1000   2000    3000
14  U   A1000   -1000   2000
21  U   A1000   -500    1500

B2000

ID  Flag    Art.No  Amount  B2000 Example
2   U   B2000   -5  
3   V   B2000   900 
4   U   B2000   -10 
5   I   B2000   50  
6   U   B2000   -20 
17  U   B2000   -5  
18  U   B2000   -5  
19  I   B2000   40  
20  V   B2000   200 200
22  U   B2000   -50 150

C3000

ID  Flag    Art.No  Amount  C3000 Example
15  I   C3000   10000   10000
16  U   C3000   -4000   6000
23  U   C3000   -1000   5000

為了在數據集中獲得更多歷史記錄,在像這樣的最新 V-transaction 之前有值會很好

To get more history in the dataset there would be nice to have values before the latest V-transaction like this

B2000

ID  Flag    Art.No  Amount  B2000 Example
2   U   B2000   -5  150
3   V   B2000   900 140
4   U   B2000   -10 140
5   I   B2000   50  190
6   U   B2000   -20 170
17  U   B2000   -5  165
18  U   B2000   -5  160
19  I   B2000   40  200
20  V   B2000   200 200
22  U   B2000   -50 150

考慮每個 I 和 U 事務但忽略 V 事務.

Where each I and U transaction is taken in consideration but V-transactions is ignored.

推薦答案

with cte as
 (
   select *,
      -- find the latest 'V' ID per ArtNo
      max(case when Flag = 'V' then ID end) 
      over (partition by ArtNo) as Last_V_ID
   from myTable
 )
select *,
   -- cumulative sum, but ignore all rows before the latest 'V' ID
   -- includes rows when there's no 'V' ID for this ArtNo
   sum(case when ID < Last_V_ID then null else Amount end)
   over (partition by ArtNo
         order by ID
         rows unbounded preceding)
from cte
order by ArtNo, ID

參見 Fiddle

要包含上次盤點之前的數據并忽略所有之前的盤點,您可以使用以下方法:

To include the data before the last stocktaking and to ignore all previous stocktakings you can use this approach:

with cte as
 (
   select *,
      -- find the latest 'V' ID per ArtNo
      max(case when Flag = 'V' then ID end) 
      over (partition by ArtNo) as Last_V_ID
   from [dbo].[Warehouse]
 )
select *,
   -- cumulative sum, but ignore all rows before the latest 'V' ID
   -- includes rows when there's no 'V' ID for this ArtNo
   sum(case when ID < Last_V_ID then null else Amount end)
   over (partition by ArtNo
         order by ID
         rows unbounded preceding)
   -- calculate in-stock based on last 'V' ID, discarding all previous 'V' rows
  ,sum(case when (ID < Last_V_ID and Flag <> 'V')  then -Amount 
            when ID = Last_V_ID then Amount 
       end)
   over (partition by ArtNo
         order by ID 
         rows between 1 following and unbounded following)
from cte
order by ArtNo, ID

兩種計算都是互斥的,因此您可以使用 COALESCE 輕松地將它們組合起來.

Both calculations are mutually exlusive, so you can easily combine them using COALESCE.

參見 Fiddle

這篇關于SQL Server 根據不同的標志計算累積總和/條件運行總和的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 国产精品精品久久久 | 日批日韩在线观看 | 一区二区三区欧美 | 国产精品毛片久久久久久 | 国产高清精品一区二区三区 | 欧美日本一区 | 国产精品99一区二区 | 国产精品jizz在线观看老狼 | 亚洲一区二区三区在线视频 | 国产精选一区 | 中文字幕一区在线观看视频 | 男人的天堂一级片 | 97超碰人人草 | 亚洲欧美视频一区 | 不卡在线视频 | 久热精品在线观看视频 | 中文在线一区二区 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 亚洲精品视频三区 | 毛片免费观看视频 | 欧美福利久久 | 天堂亚洲网 | 亚洲色图网址 | 国产精品美女久久久久久免费 | 欧美成视频在线观看 | 国产精品成人在线 | 天天操综合网站 | 欧美精品国产精品 | 成年人在线视频 | 色免费视频 | 亚洲欧美精品在线观看 | 欧美一级片黄色 | 一区二区成人在线 | 99精品一区二区 | 日韩国产在线观看 | www.日韩 | 欧美久操网 | 最新国产精品精品视频 | 手机看黄av免费网址 | 永久www成人看片 | 亚洲一区国产精品 |