Я пытаюсь перевести немного кода из FoxPro на SQL Server, и я столкнулся с очень странным поведением.Перевести код SQL-кода 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.
Итак, есть разница в 100 тыс. И потому что речь идет о деньгах, это много. Я отчаянно ищу решение, поэтому я прошу. Является ли мой перевод SQL точно отражением кода от FoxPro?
Столы одинаковые, поэтому данные. В SQL я использую связанный сервер для доступа к этим dbfs. Поле «koruny» хранится в dbf как тип данных float.
Какие два запроса возвращаются сами по себе? У них одинаковый набор результатов? Я имею в виду два полных оператора 'select'. – BellevueBob