Использование альтернативной таблицы вместо промежуточной таблицы для объединения данных с самим собой - PullRequest
0 голосов
/ 28 марта 2019

Пытаясь оптимизировать мой код, чтобы не использовать временный, я новичок в 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 

Вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...