złączenie wewnątrz tabeli

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, obiekty COM .NET

Moderator: mikey

yakuzz
Posty: 18
Rejestracja: 02 cze 2022, 10:58
Rola: Użytkownik CDN XL
Wersja: 2019

złączenie wewnątrz tabeli

Post autor: yakuzz »

mam prośbę o pomoc w poprawieniu błędu w kodzie, chciałem dodać kolumnę która będzie pokazywać kontrahenta głównego , Knt_KnGNumer as 'Główny' , uzupełniłem joinem i wywala błędem Niejednoznaczna nazwa kolumny „Knt_GIDNumer”. Tu moja wiedza się chwilowo kończy. Co gdzie musze uzupełnić żeby to ruszyło?

select knt_gidnumer
, knt_gidnumer as [ID]
, knt_akronim as [Akronim]
, Knt_KnGNumer as 'Główny'
, knt_nazwa1 as [Nazwa]
, case when knt_typ=8 then 'dostawca'
when knt_typ=16 then 'odbiorca'
when knt_typ=24 then 'odbiorca/dostawca'
else 'inny'
end as [dostawca/odbiorca]
, isnull((select top 1 a.knt_akronim from cdn.kntkarty a where a.Knt_GIDNumer=k.Knt_AkwNumer and a.Knt_GIDTyp=k.Knt_AkwTyp),'') as [Akwizytor]
, SLW_WartoscS As [Rodzaj]
, isnull(Prc_Akronim,'') as [Opiekun czasowy]
, case when Knt_Archiwalny=1 then 'TAK' else 'NIE' end as [Archiwalny]
, o.KnK_Termin [Ostatnia notatka]
, ZAM.zan_termin [Ostatnie zamówienie]
, SPR.TrnData [Ostatnia transakcja]
, case when Knt_BlokadaTransakcji=1 then 'TAK' else 'NIE' end as [Blokada_transakcji]
, case when cdn.adv_CzyBlokadaKnt(K.Knt_GIDNumer, K.Knt_GIDTyp)=1 then 'TAK'
when cdn.adv_CzyBlokadaKnt(K.Knt_GIDNumer, K.Knt_GIDTyp)=2 then 'TAK'
else 'NIE'
end as [Info o zadłużeniu]
from cdn.kntkarty k
left join cdn.KntKarty on K.Knt_KnGNumer = Knt_GIDNumer and Knt_KnGTyp = Knt_GIDTyp
left join cdn.slowniki on slw_id=Knt_Rodzaj and SLW_Kategoria='Rodzaje kontrahentów'
left join cdn.KntOpiekun cZ on KNT_GIDNumer=cz.KtO_KntNumer and cz.KtO_KntTyp=32
left join cdn.PrcKarty on Prc_GIDNumer=KtO_PrcNumer
left join (select KnK_KntNumer, cast(cdn.tstodate(max(KnK_Termin),0) as date) knk_termin from cdn.KntKontakty where KnK_KntTyp=32 group by KnK_KntNumer ) as o on k.Knt_GIDNumer=o.KnK_KntNumer
left join (select ZaN_KntNumer, cast(cdn.tstodate(max(ZaN_DataWystawienia),0) as date) zan_termin from cdn.zamnag where ZaN_ZamTyp =1280 and ZaN_Rodzaj = 4 and zan_stan >=3 group by ZaN_KntNumer ) as ZAM on k.Knt_GIDNumer = ZAM.ZaN_KntNumer
left join (select TrN_KntNumer, cast(cdn.tstodate(max(TrN_Data2),0) as date) TrnData from cdn.TraNag where trn_gidtyp in (2033,2034,2037) and TrN_Stan >=3 group by TrN_KntNumer ) as SPR on k.Knt_GIDNumer = SPR.TrN_KntNumer
where {filtrsql}
--((Knt_Archiwalny<>1)) and Knt_Typ&10000 = 16

praiser
Posty: 323
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: praiser »

jeżeli jest alias k na KntKarty to musi być też drugi np. k1

np. tutaj jest niejednoznaczna nazwa kolumny

select knt_gidnumer
, knt_gidnumer as [ID]

Czyli w join powinieneś mieć

from cdn.kntkarty k
left join cdn.KntKarty k1 on K.Knt_KnGNumer = k1.Knt_GIDNumer and K.Knt_KnGTyp = k1.Knt_GIDTyp

i potem operować na KntKarty aliasami k lub k1 czyli

select k.knt_gidnumer
, k1.knt_gidnumer as [ID]
, k1.knt_akronim as [Akronim]
, k1.Knt_KnGNumer as 'Główny'
, k1.knt_nazwa1 as [Nazwa]

itd..

yakuzz
Posty: 18
Rejestracja: 02 cze 2022, 10:58
Rola: Użytkownik CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: yakuzz »

Dzięki za odpowiedz,
tu jeszcze chyba do końca nie wiem czy koncepcja dobra:
czyli złączenia wcześniejsze które jest na aliasie k wpisuje wszędzie k a z tym nowym joinem wpisuje k1, czy wszędzie k1 przy każdej kolumnie? (łącznie z case??) Czy teraz musze dopisać wszędzie przy joinach w knt_karty alias k. za wyjątkiem tego jednego co dodałem kolumnę z kontrahentem głównym??

select knt_gidnumer
, k.knt_gidnumer as [ID]
, k.knt_akronim as [Akronim]
, k1.Knt_KnGNumer as 'Główny'
, k.knt_nazwa1 as [Nazwa]
??
left join cdn.KntKarty k1 on K.Knt_KnGNumer = k1.Knt_GIDNumer and K.Knt_KnGTyp = k1.Knt_GIDTyp
left join cdn.KntKarty on K.Knt_KnGNumer = Knt_GIDNumer and Knt_KnGTyp = Knt_GIDTyp

to te dwa joiny??

praiser
Posty: 323
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: praiser »

Kod: Zaznacz cały

select k.knt_gidnumer
, k.knt_gidnumer as [ID]
, k.knt_akronim as [Akronim]
, k1.Knt_KnGNumer as [Główny]
, k.knt_nazwa1 as [Nazwa]
, case when k.knt_typ=8 then 'dostawca'
when k.knt_typ=16 then 'odbiorca'
when k.knt_typ=24 then 'odbiorca/dostawca'
else 'inny'
end as [dostawca/odbiorca]
, isnull((select top 1 a.knt_akronim from cdn.kntkarty a where a.Knt_GIDNumer=k.Knt_AkwNumer and a.Knt_GIDTyp=k.Knt_AkwTyp),'') as [Akwizytor]
, SLW_WartoscS As [Rodzaj]
, isnull(Prc_Akronim,'') as [Opiekun czasowy]
, case when k.Knt_Archiwalny=1 then 'TAK' else 'NIE' end as [Archiwalny]
, o.KnK_Termin [Ostatnia notatka]
, ZAM.zan_termin [Ostatnie zamówienie]
, SPR.TrnData [Ostatnia transakcja]
, case when k.Knt_BlokadaTransakcji=1 then 'TAK' else 'NIE' end as [Blokada_transakcji]
, case when cdn.adv_CzyBlokadaKnt(K.Knt_GIDNumer, K.Knt_GIDTyp)=1 then 'TAK'
when cdn.adv_CzyBlokadaKnt(K.Knt_GIDNumer, K.Knt_GIDTyp)=2 then 'TAK'
else 'NIE'
end as [Info o zadłużeniu]
from cdn.kntkarty k
left join cdn.KntKarty k1 on K.Knt_KnGNumer = k1.Knt_GIDNumer and k.Knt_KnGTyp = k1.Knt_GIDTyp
left join cdn.slowniki on slw_id=k.Knt_Rodzaj and SLW_Kategoria='Rodzaje kontrahentów'
left join cdn.KntOpiekun cZ on k.KNT_GIDNumer=cz.KtO_KntNumer and cz.KtO_KntTyp=32
left join cdn.PrcKarty on Prc_GIDNumer=KtO_PrcNumer
left join (select KnK_KntNumer, cast(cdn.tstodate(max(KnK_Termin),0) as date) knk_termin from cdn.KntKontakty where KnK_KntTyp=32 group by KnK_KntNumer ) as o on k.Knt_GIDNumer=o.KnK_KntNumer
left join (select ZaN_KntNumer, cast(cdn.tstodate(max(ZaN_DataWystawienia),0) as date) zan_termin from cdn.zamnag where ZaN_ZamTyp =1280 and ZaN_Rodzaj = 4 and zan_stan >=3 group by ZaN_KntNumer ) as ZAM on k.Knt_GIDNumer = ZAM.ZaN_KntNumer
left join (select TrN_KntNumer, cast(cdn.tstodate(max(TrN_Data2),0) as date) TrnData from cdn.TraNag where trn_gidtyp in (2033,2034,2037) and TrN_Stan >=3 group by TrN_KntNumer ) as SPR on k.Knt_GIDNumer = SPR.TrN_KntNumer
where {filtrsql}
--((Knt_Archiwalny<>1)) and Knt_Typ&10000 = 16

yakuzz
Posty: 18
Rejestracja: 02 cze 2022, 10:58
Rola: Użytkownik CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: yakuzz »

teraz wywala mi jeszcze błędem Niejednoznaczna nazwa kolumny „Knt_Archiwalny”. Nawet jak wyrzuce całego case to i tak pojawia sie ten błąd. Brakuje jeszcze join dla tej kolumny?

praiser
Posty: 323
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: praiser »

nie powinien, chyba, że dodałeś komentowaną ostatnią linijkę bo tam nie ma aliasów

yakuzz
Posty: 18
Rejestracja: 02 cze 2022, 10:58
Rola: Użytkownik CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: yakuzz »

też tak myślałem czy tego nie woła, ale usunąłem ten wiersz w całości

praiser
Posty: 323
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: praiser »

No tak, ja to sprawdzałem w SQL studio a tu jeszcze filtr. więc tak:

Kod: Zaznacz cały

select 1 as ID,

z.ID
,z.[Akronim]
,K1.[Knt_Akronim]+' '+K1.[Knt_Nazwa1] as [Główny]
,z.[Nazwa]
,z.[dostawca/odbiorca]
,z.[Akwizytor]
,z.[Rodzaj]
,z.[Opiekun czasowy]
,z.[Archiwalny]
,z.[Ostatnia notatka]
,z.[Ostatnie zamówienie]
,z.[Ostatnia transakcja]
,z.[Blokada_transakcji]
,z.[Info o zadłużeniu]

from (

select knt_gidnumer
, knt_gidnumer as [ID]
, knt_KngNumer as [KNG]
, knt_akronim as [Akronim]
, knt_nazwa1 as [Nazwa]
, case when knt_typ=8 then 'dostawca'
when knt_typ=16 then 'odbiorca'
when knt_typ=24 then 'odbiorca/dostawca'
else 'inny'
end as [dostawca/odbiorca]
, isnull((select top 1 a.knt_akronim from cdn.kntkarty a where a.Knt_GIDNumer=Knt_AkwNumer and a.Knt_GIDTyp=Knt_AkwTyp),'') as [Akwizytor]
, SLW_WartoscS As [Rodzaj]
, isnull(Prc_Akronim,'') as [Opiekun czasowy]
, case when Knt_Archiwalny=1 then 'TAK' else 'NIE' end as [Archiwalny]
, o.KnK_Termin [Ostatnia notatka]
, ZAM.zan_termin [Ostatnie zamówienie]
, SPR.TrnData [Ostatnia transakcja]
, case when Knt_BlokadaTransakcji=1 then 'TAK' else 'NIE' end as [Blokada_transakcji]
, case when cdn.adv_CzyBlokadaKnt(Knt_GIDNumer, Knt_GIDTyp)=1 then 'TAK'
when cdn.adv_CzyBlokadaKnt(Knt_GIDNumer, Knt_GIDTyp)=2 then 'TAK'
else 'NIE'
end as [Info o zadłużeniu]
from cdn.kntkarty
left join cdn.slowniki on slw_id=Knt_Rodzaj and SLW_Kategoria='Rodzaje kontrahentów'
left join cdn.KntOpiekun cZ on KNT_GIDNumer=cz.KtO_KntNumer and cz.KtO_KntTyp=32
left join cdn.PrcKarty on Prc_GIDNumer=KtO_PrcNumer
left join (select KnK_KntNumer, cast(cdn.tstodate(max(KnK_Termin),0) as date) knk_termin from cdn.KntKontakty where KnK_KntTyp=32 group by KnK_KntNumer ) as o on Knt_GIDNumer=o.KnK_KntNumer
left join (select ZaN_KntNumer, cast(cdn.tstodate(max(ZaN_DataWystawienia),0) as date) zan_termin from cdn.zamnag where ZaN_ZamTyp =1280 and ZaN_Rodzaj = 4 and zan_stan >=3 group by ZaN_KntNumer ) as ZAM on Knt_GIDNumer = ZAM.ZaN_KntNumer
left join (select TrN_KntNumer, cast(cdn.tstodate(max(TrN_Data2),0) as date) TrnData from cdn.TraNag where trn_gidtyp in (2033,2034,2037) and TrN_Stan >=3 group by TrN_KntNumer ) as SPR on Knt_GIDNumer = SPR.TrN_KntNumer

) Z
left join CDN.KntKarty K1 ON Z.KNG = K1.Knt_GidNumer
where {filtrsql}

yakuzz
Posty: 18
Rejestracja: 02 cze 2022, 10:58
Rola: Użytkownik CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: yakuzz »

już wiem co jest nie tak, wykres jest z poziomu listy kontrahentów, gdzie jest już filtr klientów archiwalnych i dlatego nie można w tym miejscu zrobić wykresu z aliasem dla tego parametru bo czepia się własnie tego filtra.

yakuzz
Posty: 18
Rejestracja: 02 cze 2022, 10:58
Rola: Użytkownik CDN XL
Wersja: 2019

Re: złączenie wewnątrz tabeli

Post autor: yakuzz »

dzięki wielkie za pomoc Praiser

ODPOWIEDZ