select sum(case `TYPE` when '轉入' then `AMOUNT`
when '轉出' then -1 * `AMOUNT`
end ) balance
from T
| balance |
|---------|
| 100 |
想請問一下,有沒有辦法每一行的balance都計算
select *, (
select sum(case `TYPE` when '轉入' then `AMOUNT`
when '轉出' then -1 * `AMOUNT`
end ) balance
from T T2
where T2.`TRANSACTIONDATE` <= T1.`TRANSACTIONDATE`
) balance
from T T1
結果:
| TRANSACTIONDATE | TYPE | AMOUNT | balance |
|----------------------|------|--------|---------|
| 2018-07-31T06:00:00Z | 轉入 | 100 | 100 |
| 2018-07-31T08:00:00Z | 轉出 | 100 | 0 |
| 2018-07-31T10:00:00Z | 轉入 | 100 | 100 |
可以利用變數方式來做,效率會比較好。
而不是每次都select一次
感謝大大的回答,我會試試看你提供的方法
想請問一下,有沒有辦法每一行的balance都計算
MySQL版本是多少呢?
我更新回答你的新問題了 :)
這個MySQL Script很難令人理解.
加個 order by T1.TRANSACTIONDATE 會更好
rogeryao
不用加order,因為where已經比較過日期
fuzzylee1688
哪邊難理解呢?
('2018-07-31 06:00:00', '轉入', 100),
('2018-07-31 08:00:00', '轉出', 20),
('2018-07-31 10:00:00', '轉入', 100),
('2018-07-31 09:00:00', '轉出', 30)
用這試試 ....
資料沒錯
在9點的時候balance 50沒錯的
| TRANSACTIONDATE | TYPE | AMOUNT | balance |
|----------------------|------|--------|---------|
| 2018-07-31T06:00:00Z | 轉入 | 100 | 100 |
| 2018-07-31T08:00:00Z | 轉出 | 20 | 80 |
| 2018-07-31T10:00:00Z | 轉入 | 100 | 150 |
| 2018-07-31T09:00:00Z | 轉出 | 30 | 50 |
是說給使用者看的畫面呈現方式嗎? rogeryao
這可以按樓主想要的方式調整的
Yes
明白XD 假如樓主想要優化呈現可以加order
@暐翰 常用的ANSI SQL會認為你怎麼會在欄位查詢去下sub Query, 且也沒針對TRANSACTIONDATE 做group就能直接join T1,蠻奇怪的.
常用的ANSI SQL會認為你怎麼會在欄位查詢去下sub Query
MySQL可以使用變數保存方式來做,我有補充
且也沒針對TRANSACTIONDATE 做group就能直接join T1,蠻奇怪的.
SQL順序 from -> group -> select
所以T1在前面已經生成,select時候就可以捕捉到
大大是問這個嗎?
是的, where T2.TRANSACTIONDATE <= T1.TRANSACTIONDATE 能做JOIN我能理解, 怎麼GROUP就不了了.