Pozdzapytanie z pobranie wartości na podstawie innej kolumny

0

Hej
Mam pytanie. Potrzebuję wyciągnąć z bazy jak poniżej:

Koncowa Kontrakt_ID Wystawil
1 11 Marek Nowak
0 11 Jerzy Testowy
1 12 Fabian Wspaniały
0 13 Marek Nowak
1 13 Marian Kowalski

Zamysłem jest aby wyciągnąć z niej dane odnośnie Kolumny Wystawil ale w taki sposób, że jeżeli wartosc Koncowa = 1 to pokaż Wystawil a jeżeli Koncowa = 0 to pokaż kto wystawił dokument dla którego dla każdej grupy Kontrakt_ID wartość Koncowa = 1

Dla rozjaśnienia chodzi tu o faktury zaliczkowe które są wystawiane przez kilku pracowników (Wystawil) dla jednego kontrahenta w ramach jednej transakcji (Kontrakt_ID). W momencie kiedy pracownik wystawia FV końcową (Koncowa = 1) to dla wszystkich faktur zaliczkowych z danej transakcji ma on się pokazywać w raporcie jako wystawiający.

Czyli wynik powyższego powinien być:

Koncowa Kontrakt_ID Wystawil
1 11 Marek Nowak
0 11 Marek Nowak
1 12 Fabian Wspaniały
1 13 Marian Kowalski
0 13 Marian Kowalski

Wartość Koncowa występuje tylko jako 0 lub 1 i zawsze jest tylko jedna pozycja z wartością 1 dla danej transakcji. Zapytanie musi działać jako podzapytanie lub jako wynik kolumny do Selecta

Może ktoś coś podsunąć?

Pozdrawiam
Piotr Kukla

3

pisane z głowy ale coś w ten deseń

select m.koncowa, m.kontrakt_id, case when m.koncowa = 1 then m.wystawil else (select p.wystawil from table p where p.kontrakt_id = m.kontrakt_id and p.koncowa = 1) end
 from table m
where ...
0

Super faktycznie na testowych danych które podałem zachowało się tak jak potrzebuję. Ale na produkcji mam problem. Czy w tym zapytaniu mogą występować INNER JOINy?
Każde z zapytań pojedynczo daje zamierzony efekt. Po zsumowaniu ilości wierszy wychodzi mi prawidłowa ilość ale SQL zgłasza błąd:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression

Poniżej zapytanie:

Select az.Koncowa, az.KontraktZaliczki_Id,
CASE When az.Koncowa = 1 Then m.Wystawil
Else 


(select p.Wystawil 

from 

						 ModelDanychContainer.Dokumenty as p INNER JOIN
                         ModelDanychContainer.AspektyZaliczki as z ON p.Id = z.DokumentHandlowy_Id 
						 						 INNER JOIN
                         ModelDanychContainer.KontraktyZaliczek as k ON z.KontraktZaliczki_Id = k.Id
						 
						 Where z.KontraktZaliczki_Id = z.KontraktZaliczki_Id and z.Koncowa = 1)
						 
end
from 
ModelDanychContainer.Dokumenty as m INNER JOIN
                         ModelDanychContainer.AspektyZaliczki as az ON m.Id = az.DokumentHandlowy_Id 
						 						 INNER JOIN
                         ModelDanychContainer.KontraktyZaliczek as kz ON az.KontraktZaliczki_Id = kz.Id
1

Zamiast podzapytania użyj JOINA z tymi danymi - tu dla lepszej przejrzystości użyte CTE (pisane na "kolanie" mogą być jakieś błędy ale zasada powinna być ok):

WITH cte as
(select k.Id, p.Wystawil 
from Dokumenty as p 
INNER JOIN  AspektyZaliczki as z 
    ON p.Id = z.DokumentHandlowy_Id 
 INNER JOIN  KontraktyZaliczek as k 
    ON z.KontraktZaliczki_Id = k.Id
Where z.Koncowa = 1)

Select az.Koncowa, az.KontraktZaliczki_Id,
CASE When az.Koncowa = 1 
    Then m.Wystawil
    Else cte.wystawil
end
from Dokumenty as m 
INNER JOIN AspektyZaliczki as az 
    ON m.Id = az.DokumentHandlowy_Id 
INNER JOIN  KontraktyZaliczek as kz 
    ON az.KontraktZaliczki_Id = kz.Id
JOIN cte c
   on c.id = kz.Id
0

@BlackBad: Dzięki. Genialne. Właśnie o to chodziło. Temat CTE mi zupełnie umknął.
Zamiast k.Id powinno być z.KontraktZaliczki_Id po poprawieniu działa idealnie.

Jeszcze raz dzięki serdeczne!

1

Każde z zapytań pojedynczo daje zamierzony efekt. Po zsumowaniu ilości wierszy wychodzi mi prawidłowa ilość ale SQL zgłasza błąd:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression

To znaczy, że niezgadza się założenie:

Wartość Koncowa występuje tylko jako 0 lub 1 i zawsze jest tylko jedna pozycja z wartością 1 dla danej transakcji. Zapytanie musi działać jako podzapytanie lub jako wynik kolumny do Selecta

Join tego nie wyłapie więc warto sprawdzić, czy nie masz jakiegoś błędu w danych

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