Wyciągnięcie informacji o efakturze

0

Witam.

Mam pewien problem z zapytaniem. Mam bazę z fakturami które mogę być normalne i efakturami. Chciałbym wyciągnąć różne informacje o kliencie i jedną z nich jest to czy klient jest na "efakturze" czyli jeżeli kiedykolwiek miał to znaczy że jest.

Tworzę pewne zapytanie które zwraca mi prawidłowe dane:

SELECT DISTINCT *
 FROM (SELECT copa.ODBIORCA, DECODE(copa.EFAKTURA,'X','TAK',' ','NIE') "Czy Efaktura",
                dense_rank() over (partition by copa.ODBIORCA
                                     order by (case when copa.EFAKTURA = 'X'
                                                   then 1
                                                     else 0
                                                  end) desc,
                                                
                                                copa.EFAKTURA DESC) rnk
 
           FROM olap_dane.mv_sap_copa copa
           )
 WHERE rnk = 1
;

Czyli rank jest 1 i to pokazuje wartość X(zamienianą na TAK) jeżeli jest efaktura lub puste(zamienione na NIE) jeżeli nie ma takiej efaktury

Wszystko pięknie tylko jak w większym zapytaniu chciałbym tego użyć to niestety zapytanie grupuje mi nie tylko do tego co było wyżej ale pokazuje również wartość NIE. Problem polega pewnie na moim błednym zgrupowaniu.

SELECT DISTINCT ve."dzial sprzedazy",

(Case ve."dzial sprzedazy" WHEN '0190' THEN 'BH Białystok' WHEN '0290' THEN 'BH Bydgoszcz' WHEN '0530' THEN 'BH Centrala' WHEN '0140' THEN 'BH Kalisz' WHEN '0210' THEN 'BH Katowice' WHEN '0130' THEN 'BH Kielce' WHEN '0230' THEN 'BH Kraków' WHEN '0260' THEN 'BH Olsztyn' WHEN '0120' THEN 'BH Poznań' WHEN '0180' THEN 'BH Szczecin' WHEN '0160' THEN 'BH Warszawa' WHEN '0220' THEN 'BH Wrocław' WHEN '0000' THEN 'DOKK' WHEN '0520' THEN 'Call Center' WHEN '0520' THEN 'Call Center' Else NULL END) BH


 ,ve.KOD_ODBIORCY "Kod Odbiorcy",ve.NAZWA1 "Nazwa Firmy",ve.NAZWISKO_IMIE_PH "Nazwisko Imię PH", odb.MIEJSCOWOSC,
 odb.SEGMENT2017,odb.SEGMENT2018,branza.OZNACZENIA_ODBIORCY,
 
 (SELECT DISTINCT DECODE(copa.EFAKTURA,'X','TAK',' ','NIE')
 
 FROM (
            SELECT DISTINCT *
 FROM (SELECT copa.ODBIORCA, DECODE(copa.EFAKTURA,'X','TAK',' ','NIE') "Czy Efaktura",
                dense_rank() over (partition by copa.ODBIORCA
                                     order by (case when copa.EFAKTURA = 'X'
                                                   then 1
                                                     else 0
                                                  end) desc,
                                                
                                                copa.EFAKTURA DESC) rnk
 
           FROM olap_dane.mv_sap_copa copa
           )
 WHERE rnk = 1 
 
 )
 )"Czy e-fv"
 

FROM OLAP_DANE.MV_PRZYPISANIE_VE ve,olap_dane.mv_sap_odbiorcy odb,olap_dane.mv_sap_branze branza,olap_dane.mv_sap_copa copa
WHERE ve.KOD_ODBIORCY = odb.KOD_ODBIORCY 
AND odb.KOD_BRANZY = branza.KOD_BRANZY
AND odb.KOD_ODBIORCY = copa.ODBIORCA
AND copa.ODBIORCA = '0001011942'
GROUP BY ve."dzial sprzedazy",ve.KOD_ODBIORCY,ve.NAZWA1 ,ve.NAZWISKO_IMIE_PH, odb.MIEJSCOWOSC,odb.SEGMENT2017,odb.SEGMENT2018,branza.OZNACZENIA_ODBIORCY,copa.EFAKTURA

;

Oto rezultat dla jednego klienta w zapytaniu powyżej:

screenshot-20180508124203.png

Proszę o pomoc bo już nie ma na to pomysłów oraz w miarę możliwości o wyjaśnienie błędu abym nie go już więcej.

1

Nie wiem po co, te wszystkie funkcje analityczne jak i tak grupujesz, samo to zapytanie jest niepotrzebne bo sięgasz po dane które już pobierasz.
dodatkowo używasz 2x aliasy copa, i ja powiem szczerze nie wiem do czego to się odnosi ale mam wrażenie że do tabeli w joinie (mam na myśli ten fragment: SELECT DISTINCT DECODE(copa.EFAKTURA,'X','TAK',' ','NIE')), patrząc na zagnieżdżenie nawiasów. Nie widzę też filtru na odbiorcę w podzapytaniu.
Dodatkowo po co distinct jak używasz group by, z drugiej zaś strony po co group by bez żadnej agregacji?

Możesz zawsze to uprościć:

SELECT
	ve."dzial sprzedazy", 
	(CASE ve."dzial sprzedazy" 
		WHEN '0190' THEN 'BH Białystok' 
		WHEN '0290' THEN 'BH Bydgoszcz' 
		WHEN '0530' THEN 'BH Centrala' 
		WHEN '0140' THEN 'BH Kalisz' 
		WHEN '0210' THEN 'BH Katowice' 
		WHEN '0130' THEN 'BH Kielce' 
		WHEN '0230' THEN 'BH Kraków' 
		WHEN '0260' THEN 'BH Olsztyn' 
		WHEN '0120' THEN 'BH Poznań' 
		WHEN '0180' THEN 'BH Szczecin' 
		WHEN '0160' THEN 'BH Warszawa' 
		WHEN '0220' THEN 'BH Wrocław' 
		WHEN '0000' THEN 'DOKK' 
		WHEN '0520' THEN 'Call Center' 
		WHEN '0520' THEN 'Call Center' 
		ELSE NULL 
	END )                  BH, 
	ve.kod_odbiorcy          "Kod Odbiorcy", 
	ve.nazwa1                "Nazwa Firmy", 
	ve.nazwisko_imie_ph      "Nazwisko Imię PH", 
	odb.miejscowosc, 
	odb.segment2017, 
	odb.segment2018, 
	branza.oznaczenia_odbiorcy, 
	max(CASE WHEN copa.efaktura = 'X' THEN 1 ELSE  0 END) "Czy e-fv" 
FROM   
    olap_dane.mv_przypisanie_ve ve, 
    inner join olap_dane.mv_sap_odbiorcy odb on ve.kod_odbiorcy = odb.kod_odbiorcy  
    inner join   olap_dane.mv_sap_branze branza on  odb.kod_branzy = branza.kod_branzy
    inner join  olap_dane.mv_sap_copa copa on odb.kod_odbiorcy = copa.odbiorca 
WHERE  
     copa.odbiorca = '0001011942' 
GROUP  BY 
	ve."dzial sprzedazy", 
	ve.kod_odbiorcy, 
	ve.nazwa1, 
	ve.nazwisko_imie_ph, 
	odb.miejscowosc, 
	odb.segment2017, 
	odb.segment2018, 
	branza.oznaczenia_odbiorcy
0

Pięknie dziękuję :) Wszystko dobrze działa i bardzo szybko. Chyba rzeczywiście namieszałem ale dopiero zaczynam przygodę z SQL. Poczytam i poćwiczę więcej wtedy będzie to na pewno lepiej wyglądało.

Mam jeszcze pytanie jak wyrażenie :

MAX(CASE WHEN copa.efaktura = 'X' THEN 1 ELSE  0 END)

Zmienić tak że jeżeli jest 1 to "TAK" a jeżeli 0 to "NIE" ? Chciałem użyć DECODE lecz niestety nie działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1