iT邦幫忙

0

SQL 多重欄位的加總計算

請問 sql菜鳥遇到鐵板,案例如下https://ithelp.ithome.com.tw/upload/images/20180731/20110847IsvEdaon9J.png
請問要如何計算出balance的部分,需要根據轉入或轉出進行計算

0.0a..你的balance不是都NA...
你是要加總甚麼??
可以在詳細舉例嗎??
phes11434 iT邦新手 2 級 ‧ 2018-07-31 15:18:35 檢舉
會出現na是因為我並沒有將資料寫入這欄
系統自動把它設為na
會希望做出像是銀行帳戶那樣
balance那欄是餘額
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
暐翰
iT邦大師 1 級 ‧ 2018-07-31 14:52:53
最佳解答
select sum(case `TYPE` when  '轉入' then `AMOUNT` 
             when '轉出' then -1 * `AMOUNT`
           end  ) balance
from T

結果:

| balance |
|---------|
|     100 |    

SQL Fiddle


新問題:

想請問一下,有沒有辦法每一行的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 |

SQL Fiddle


補充:

可以利用變數方式來做,效率會比較好。
而不是每次都select一次

看更多先前的回應...收起先前的回應...
phes11434 iT邦新手 2 級 ‧ 2018-07-31 15:19:16 檢舉

感謝大大的回答,我會試試看你提供的方法

phes11434 iT邦新手 2 級 ‧ 2018-07-31 15:25:33 檢舉

想請問一下,有沒有辦法每一行的balance都計算

暐翰 iT邦大師 1 級 ‧ 2018-07-31 15:45:44 檢舉

MySQL版本是多少呢?

暐翰 iT邦大師 1 級 ‧ 2018-07-31 15:50:42 檢舉

我更新回答你的新問題了 :)

fuzzylee1688 iT邦研究生 3 級 ‧ 2018-08-01 10:42:39 檢舉

這個MySQL Script很難令人理解.

rogeryao iT邦超人 8 級 ‧ 2018-08-01 11:00:49 檢舉

加個 order by T1.TRANSACTIONDATE 會更好

暐翰 iT邦大師 1 級 ‧ 2018-08-01 12:06:12 檢舉

rogeryao
不用加order,因為where已經比較過日期

fuzzylee1688
哪邊難理解呢?

rogeryao iT邦超人 8 級 ‧ 2018-08-01 12:46:25 檢舉

('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)

用這試試 ....

暐翰 iT邦大師 1 級 ‧ 2018-08-01 12:55:14 檢舉

資料沒錯
在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
這可以按樓主想要的方式調整的

rogeryao iT邦超人 8 級 ‧ 2018-08-01 13:08:54 檢舉

Yes /images/emoticon/emoticon37.gif

暐翰 iT邦大師 1 級 ‧ 2018-08-01 13:38:08 檢舉

明白XD 假如樓主想要優化呈現可以加order

fuzzylee1688 iT邦研究生 3 級 ‧ 2018-08-01 13:49:06 檢舉

@暐翰 常用的ANSI SQL會認為你怎麼會在欄位查詢去下sub Query, 且也沒針對TRANSACTIONDATE 做group就能直接join T1,蠻奇怪的.

暐翰 iT邦大師 1 級 ‧ 2018-08-01 13:55:17 檢舉

常用的ANSI SQL會認為你怎麼會在欄位查詢去下sub Query

MySQL可以使用變數保存方式來做,我有補充

且也沒針對TRANSACTIONDATE 做group就能直接join T1,蠻奇怪的.

SQL順序 from -> group -> select
所以T1在前面已經生成,select時候就可以捕捉到
大大是問這個嗎?

fuzzylee1688 iT邦研究生 3 級 ‧ 2018-08-01 14:00:53 檢舉

是的, where T2.TRANSACTIONDATE <= T1.TRANSACTIONDATE 能做JOIN我能理解, 怎麼GROUP就不了了.

我要發表回答

立即登入回答