我正在尝试将一些代码从 FoxPro 转换为 SQL Server,但我遇到了非常奇怪的行为。
在 FoxPro 的应用程序中编写的这段代码:
lcZnak1 = "HM,P6";
SELECT Zakslozkap.datum,ABS(Zakslozkap.hodnota) hodnota, ABS(Zakslozkap.koruny)
koruny, Zakslozka.sekce;
FROM Zakslozkap, Zakslozka;
WHERE (Zakslozkap.SW $ lcZnak1) AND;
BETWEEN(Zakslozkap.datum,Thisform.cDatOd,Thisform.cDatDo) AND ;
Zakslozkap.ide_slozka = Zakslozka.ide_slozka AND ;
Zakslozka.ide_zak = "6065" ;
INTO CURSOR QueryNakladMZD
SUM (koruny) FOR sekce $ ('REZIE4') TO lnostat
SUM (koruny) FOR sekce $ ('REZIE3') TO lnRezie
SUM (koruny) FOR sekce $ ('SEKTOR') TO lnSekce
SUM (koruny) TO lnPodil
lnPodil= lnPodil - lnostat - lnRezie - lnSekce
产生 lnPodil = 1 721 761,07 的结果。
我用 SQL 编写的代码:
declare @lnOstat decimal(18,5) = 0
declare @lnRezie decimal(18,5) = 0
declare @lnSekce decimal(18,5) = 0
declare @lnPodil decimal(18,5) = 0
select p.datum, abs(p.hodnota) as 'hodnota', abs(p.koruny) as 'koruny', z.sekce into #tmp
from [DOCHAZKA]...[zakslozkap] p, [DOCHAZKA]...[zakslozka] z
where (p.SW = 'HM' or p.SW = 'P6')
and p.datum between @datestart and @dateend
and p.ide_slozka = z.ide_slozka
and z.ide_zak = '6065'
select @lnOstat = SUM(koruny) from #tmp where sekce = 'REZIE4'
select @lnRezie = SUM(koruny) from #tmp where sekce = 'REZIE3'
select @lnSekce = SUM(koruny) from #tmp where sekce = 'SEKTOR'
select @lnPodil = SUM(koruny) from #tmp
select @lnPodil = isnull(@lnPodil,0) - isnull(@lnOstat,0) - isnull(@lnRezie,0) - isnull(@lnSekce,0)
drop table #tmp
产生@lnPodil = 1 623 779.67 的结果。
所以,有 100k 的差异,因为这是关于钱的,所以很多。我急于寻找解决方案,所以我在那里问。我的 SQL 翻译是否完全反映了 FoxPro 的代码?
表是一样的,所以数据。在 SQL 中,我使用链接服务器来访问这些 dbfs。字段“koruny”作为浮点数据类型存储在 dbf 中。