Пытаясь оптимизировать мой код, чтобы не использовать временный, я новичок в SQL Server, код, который я написал, дает мне необходимую информацию
Create table FI (
tipodoc numeric,
nmdoc varchar(20),
fno numeric,
rdata datetime,
fnoft numeric,
design varchar(60);
Insert into Fi (tipodoc ,
nmdoc,
fno,
rdata ,
fnoft ,
design)
values(1,'FT','18',2017-31-12,null,null),
(2,'NC',1,2018-31-12,18,'FT 18 18-12-2017'),
(1,'FT',1,2018-01-01,null,null),
(2,'NC',1,2018-31-12,1,'FT 1 01-01-2018'),
(1,'FT',2,2018-31-12,null,null),
(2,'NC',1,2019-31-12,5,'FT 2 31-12-2018')
select
Cod_final = convert(int,fi.fnoft+fi.tipodoc+fi.rdata),
fi.tipodoc,
fi.nmdoc,
fi.fno,
fi.rdata,
fi.fnoft,
ltrim(rtrim(CONVERT(varchar(30),replace(right(design,10 ),'.','-')))) as Ftdata
into tempFI
from fi
where fi.nmdoc Like '%Credito' and design like '%factura%';
select
tempFI.Cod_final,
fi.nmdoc,
fi.fno,
convert(date,fi.rdata) as DataDoc,
Fi.fnoft,
tempFI.rdata,
tempfi.Ftdata
from fi
inner join tempfi on fi.fnoft=tempFI.fnoft
where convert(int,fi.fnoft+fi.tipodoc+fi.rdata) = tempFI.Cod_final
and fi.tipodoc =3 and tempfi.ftdata like '%-%-%'
order by tempFI.Cod_final
go
DROP TABLE IF EXISTS tempfi
необработанные данные https://docs.google.com/spreadsheets/d/1VCd8ZQVt6ztLNNhUb-FRj1WIAGW8zYZP3AZbx3GaGTs/edit?usp=sharing
Вывод данных
Краткое объяснение того, что я притворяюсь и что я сделал
Tempfi.cod_final - так как fnoft, tipodoc повторяются в течение многих лет те же самые fnoft и tipodoc (это связано с nmdoc, есть тип, связанный с типом документа) это оба int, поэтому я преобразовал rdata, который является временем данных при создании документа, и это мой новый номер, так что я могу правильно определить.
fno и fnoft - cod_final 42726 - это fno 8 и был основан на fnoft 1268 - это то же число в fno из другого типа документа tipodoc
tempfi.rdata - я проверял получение правильного значениядля даты и времени tempfi.codfinal, когда был создан документ, который я с треском провалил
tempfi.FTdata.это строка, которая содержит номер fnoft и дату создания, поэтому мои tempfi.rdata должны быть такими же, как tempfi.ftdata
, спасибо за вашу помощь, и я извиняюсь, если это немного грязно
Обновление Так что после прочтения о CTE я построил это
with cte_fi2 as
(
select
Cod_final = convert(int,fi.fnoft+fi.tipodoc+fi.rdata),
fi.tipodoc,
fi.nmdoc,
fi.fno,
fi.rdata,
fi.eteliquido
from fi
where fi.tipodoc = 1
),
cte_fi as
(
select
Cod_final = convert(int,fi.fnoft+fi.tipodoc+fi.rdata),
fi.tipodoc,
fi.nmdoc,
fi.fno,
fi.rdata,
fi.fnoft,
ltrim(rtrim(CONVERT(varchar(30),replace(right(design,10 ),'.','-')))) as Ftdata
from fi
where fi.tipodoc=3 and design like '%factura%'
)
select
fi.nmdoc,
fi.fno as NºNC,
convert(date,fi.rdata) as DataNC,
Fi.fnoft as NºFT,
cte_fi2.rdata as DataFTcte2,
cte_fi.ftdata,
from fi
inner join cte_fi on fi.fno=cte_fi.fno
inner join cte_fi2 on fi.fno = cte_fi2.fno
where fi.tipodoc =3 and cte_fi.ftdata like '%-%-%'
order by cte_fi.Cod_final
Я все еще делаю что-то не так с ct2_fi2.rdata, он должен вернуть то же значение, что и cte_fi.tdata, ct2_fi2.rdata - это дата создания fi.tipodoc = 1, думаю, я что-то не так делаю во внутреннем соединении.я не понимаю, что еще
Nmdoc FNo fi.rdata Fnoft cte_fi2.rdata cte_fi.ftdata
NC 3 2013-02-08 0 08-02-2013 2016-01-04
Вывод