NVLやISNULLに相当するParadoxのSQLの書き方は
ご存知の方教えてください。
NVLはANSI標準にはありませんが、NULLはWhere句で使えます。
質問はあいまい過ぎて、すみません。
やりたいことは
Select SUM( NVL(D."支払", 0) )from "Detail" as D Where ....
そのうち、支払がNullの場合0としてSumに計算させたいということ
です。
よろしくお願いします。
Paradoxの場合、値がNULLの場合、0で計算します。
Selectの結果でFieldの値がNullの場合は、0でどうでしょうか?
実際に以下の文で実行したら、
select D."取引先Code", D."外部Code", D."発生年", D."発生月",
Sum(D."発生") , Sum(D."支払"), Sum(D."発生")-Sum(D."支払" )
from "detail.db" as D
group by D."取引先Code", D."外部Code", D."発生年", D."発生月"
Sum(D."支払")の値が空欄になり、発生−支払の計算が合わなくなって
います。そこで、DBに支払FieldのNullを0で埋めたら、計算が
正しくなります。ですので、NVLをやりたかったわけです。
>select D."取引先Code", D."外部Code", D."発生年", D."発生月",
>Sum(D."発生") , Sum(D."支払"), Sum(D."発生")-Sum(D."支払" )
>from "detail.db" as D
>group by D."取引先Code", D."外部Code", D."発生年", D."発生月"
を
select
D."取引先Code"
, D."外部Code"
, D."発生年"
, D."発生月"
, Sum(D."発生") as Hassei
, Sum(D."支払") as Siharai
from "detail.db" as D
group by D."取引先Code", D."外部Code", D."発生年", D."発生月"
に変えて、TQueryにSum(D."発生")-Sum(D."支払" )の替わりに計算項目"zangaku"をTCurrencyを作ります。
OnCulcFieldsイベントで、合計金額が空欄でなければ、zangakuに足します。
無ければ0になります。
DataSet.FieldByName('zangaku').ascurrency := 0;
if not DataSet.FieldByName('Hassei').isNull then
DataSet.FieldByName('zangaku').ascurrency :=
DataSet.FieldByName('Hassei').ascurrency;
if not DataSet.FieldByName('Siharai').isNull then
DataSet.FieldByName('zangaku').ascurrency :=
DataSet.FieldByName('zangaku').ascurrency -
DataSet.FieldByName('Siharai').ascurrency;
Hotaさんの案はどうもありがとうございます。
ただし、どうしても一発でSQL文でできないのが
気がすまないが、SQL文でのやり方が知りたかった。
接続環境がわかりませんが、
BDEには相当する機能がないようですね。
スマートじゃないけどCASTすれば可能です。
SUM(CAST('0' + CAST(支払 AS CHAR(10)) AS FLOAT))
ADO(dbGo)であれば
SUM(IIF(ISNULL(支払),0,支払)) でできると思います。
佐助さん、ありがとうございました。
以下のようにCASTを使用してできました。感謝!
Select
D."取引先Code", D."外部Code", D."発生年", D."発生月",
Sum( CAST('0' + D."発生" As Float) ) As 発生,
Sum( CAST('0' + D."支払" As Float) ) As 支払,
From "detail.db" as D
Group by D."取引先Code", D."外部Code", D."発生年", D."発生月"
ツイート | ![]() |