iT邦幫忙

0

請問大大 sql 2個欄位相加 沒有資料---如何解決

SQL語法如下
SELECT b.stock_id,b.普通股股本,b.股本合計,b.歸屬於母公司業主之權益合計,(b.權益總計+b.權益總額) as 權益總計2 ,i.本期淨利(淨損),i.營業利益(損失),c.投資活動之淨現金流入(流出),c.營業活動之淨現金流入(流出),p.收盤價,p.date FROM balance_sheet b INNER JOIN price p ON b.stock_id = p.stock_id INNER JOIN income_sheet i on b.stock_id = i.stock_id INNER JOIN cash_flows c on b.stock_id = c.stock_id where p.date = b.date and b.stock_id='1101'

請問如何(b.權益總計+b.權益總額) as 權益總計2
(說明 b.權益總計 和 b.權益總額 有部分資料是NULL )
上面SQL語句相加後 權益總計2的資料都是NULL
謝謝

看更多先前的討論...收起先前的討論...
null是不能做數值運算的。所以你是需要先做一個判斷,讓null的值變成0給他計算。
另一個做法是從資料庫結構下手。給預設值0。不要讓它有null值。
null 就是 null
這裡的 null 其實不太適合變成 0
就好像一個人的「銀行帳戶餘額」
null 就是 null (因故不得而知)
跟 0 的差別是很大的
如果就會計來說這是事實。
不過就程式現實面來說。null不能計算是一個很大的問題。

但重點就如你所說的。為何會出現null。
第二個重點,null是否就是為0。

這不是要爭議0跟null的問題。而是null就是不能計算你要怎麼辦。

所以如果真照你的意思來看的話,變成null就是「不要計算」的意思?
還是什麼情況呢??
以原po這種問法就是要把null變成0啦...這裡的null其實很適合變成0。

不適合變成0的是類似這種:會員資料庫裡的年齡,假設你現在要算男性女性的平均年齡,結果把沒有填年齡的年齡欄位,原本是null的都給上0,那不就糟糕了,會把這些0都一起平均進去。這種例子就是「不要計算」的意思沒錯。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
純真的人
iT邦大師 1 級 ‧ 2018-10-11 15:54:26
最佳解答

這MSSQL的解法..
先判斷是否為null
是的話先轉為0

SELECT b.stock_id
,b.普通股股本
,b.股本合計
,b.歸屬於母公司業主之權益合計
,(isNull(b.權益總計,0) + isNull(b.權益總額,0) ) as 權益總計2 
,i.本期淨利(淨損)
,i.營業利益(損失)
,c.投資活動之淨現金流入(流出)
,c.營業活動之淨現金流入(流出)
,p.收盤價
,p.date 
FROM balance_sheet b 
INNER JOIN price p ON b.stock_id = p.stock_id 
INNER JOIN income_sheet i on b.stock_id = i.stock_id 
INNER JOIN cash_flows c on b.stock_id = c.stock_id
where p.date = b.date 
and b.stock_id='1101'

補充,其他類似ISNULL的寫法還包括:NVL、COALESCE。

0
rogeryao
iT邦大師 1 級 ‧ 2018-10-11 17:54:14

MS SQL :
case when isNumeric(b.權益總計)=1 and isNumeric(b.權益總額)=1
then b.權益總計 + b.權益總額
else null end as 權益總計2

0
尼克
iT邦大師 1 級 ‧ 2018-10-12 09:42:31

補充Oracle語法

SELECT b.stock_id,
       b.普通股股本,
       b.股本合計,
       b.歸屬於母公司業主之權益合計,
       (NVL (b.權益總計, 0) + NVL (b.權益總額, 0)) AS 權益總計2,
       i.本期淨利(淨損),
       i.營業利益(損失),
       c.投資活動之淨現金流入(流出),
       c.營業活動之淨現金流入(流出),
       p.收盤價,
       p.date
  FROM balance_sheet b
       INNER JOIN price p ON b.stock_id = p.stock_id
       INNER JOIN income_sheet i ON b.stock_id = i.stock_id
       INNER JOIN cash_flows c ON b.stock_id = c.stock_id
 WHERE p.date = b.date AND b.stock_id = '1101'

我要發表回答

立即登入回答