MySql Jak wywołać i połączyć w jednym zapytaniu dwa zapytania?

0

Witam

Mam napisane w MySql zapytanie zwracające ilość drzwi potrzebną do wykonania raportu w Fast Report 4.

Potrzebuję przerobić to zapytanie tak aby wracało w jednym zapytaniu : ilość drzwi oraz (dopisać) złą ilości drzwi z tego samego zapytania tylko z pominięta jedną linijką- patrz obrazki.
Dlaczego potrzebuję złą ilość? zapytanie ma zwracać dokładnie tyle samo wierszy w tabeli dobrej co złej.

Zapytanie z ilością dobrą

SELECT
  lot.code,
  lot.lot,
  detail.commande,
  count(*) as drzwi,
  commande.client,
  commande.reference,
  left(commande.repres,2) as handlowiec,
  detail.couleur
FROM lin
join detail on lin.commande=detail.commande
join detlot on lin.commande=detlot.commande and lin.chassis=detail.ordre+1
join lot on detail.lot=lot.lot
join commande on lin.commande=commande.numero
where
  scie = 1 and detlot.type = 1 and detlot.position = 3
  and lot.lot ='16135'
  and lin.code = '_DRZWI'
and detlot.chassis=detail.numero
group by detail.commande
order by detail.commande;

Zapytanie z ilością złą:

SELECT
  lot.code,
  lot.lot,
  detail.commande,
  count(*) as drzwi,
  commande.client,
  commande.reference,
  left(commande.repres,2) as handlowiec,
  detail.couleur
FROM lin
join detail on lin.commande=detail.commande
join detlot on lin.commande=detlot.commande and lin.chassis=detail.ordre+1
join lot on detail.lot=lot.lot
join commande on lin.commande=commande.numero
where
  scie = 1 and detlot.type = 1 and detlot.position = 3
  and lot.lot ='16135'
#  and lin.code = '_DRZWI'
and detlot.chassis=detail.numero
group by detail.commande
order by detail.commande;

Na 2 zdjęciach tabele po wykonaniu zapytań.

P co mi to? Jak wspomniałem zapytanie obrabia raport w FastReport a konkretnie odejmuje konkretnie pole z kolumn i musi ich być taka sama ilość.
Puste pole z NULL zamienię na 0 i wynik odejmowania będzie zgodny.

Zdjęcie 3 obrazuje o co mi chodzi :)

2
SELECT
  lot.code,
  lot.lot,
  detail.commande,
  count(case when lin.code = '_DRZWI' then lin.code end) as drzwi_dobre,
  count(case when lin.code <>'_DRZWI' then lin.code end) as drzwi_złe,
  commande.client,
  commande.reference,
  left(commande.repres,2) as handlowiec,
  detail.couleur
FROM lin
join detail on lin.commande=detail.commande
join detlot on lin.commande=detlot.commande and lin.chassis=detail.ordre+1
join lot on detail.lot=lot.lot
join commande on lin.commande=commande.numero
where
  scie = 1 and detlot.type = 1 and detlot.position = 3
  and lot.lot ='16135'
and detlot.chassis=detail.numero
group by detail.commande
order by detail.commande;
0

Kurczę , fantastycznie działa !

Jest tylko drobny błąd AS drzwi_złe zamieniłem na AS drzwi_zle i poszło !

Jeszcze raz bardzo dziękuję.

0

Czemu dodałem jako Pijany Kot , pewnie dlatego że nie byłem zalogowany ? :E

A miało być tak pięknie...

Okazało się że Główny Raport(Jest drukowany jako wstęga) nie podbiera danych z więcej niż jednego zapytania.

Zależy mi aby nie rozbijać zapytań na kod w raporcie ...

Należałoby wiec upchnąć wszystko w jednym zapytaniu, dodając tylko jedną kolumnę drzwi_dobre do Zapytania 1

Zapytanie 1:

select
  lot.code,
  lot.lot,
  detail.commande,
  sum(detail.qte)as calosc,
  commande.client,
  commande.reference,
  left(commande.repres,2) as handlowiec,
  detail.couleur
from detail
join lot on detail.lot=lot.lot
join commande on detail.commande=commande.numero
join client on commande.client=client.code
where lot.lot ='16135'
and infoprod > '0'
group by detail.commande;

# Zapytanie zwracające ilosć okien i drzwi jako całość dla pierwszej strony raportu

Zapytanie 2:

SELECT
  lot.code,
  lot.lot,
  detail.commande,
  COUNT(CASE WHEN lin.code = '_DRZWI' THEN lin.code END) AS drzwi_dobre,
  COUNT(CASE WHEN lin.code <>'_DRZWI' THEN lin.code END) AS drzwi_zle,
  commande.client,
  commande.reference,
  LEFT(commande.repres,2) AS handlowiec,
  detail.couleur
FROM lin
JOIN detail ON lin.commande=detail.commande
JOIN detlot ON lin.commande=detlot.commande AND lin.chassis=detail.ordre+1
JOIN lot ON detail.lot=lot.lot
JOIN commande ON lin.commande=commande.numero
WHERE
  scie = 1 AND detlot.TYPE = 1 AND detlot.POSITION = 3
  AND lot.lot ='16135'
AND detlot.chassis=detail.numero
GROUP BY detail.commande
ORDER BY detail.commande;

Oczekiwany efekt końcowy na zdjęciu:

0

Wiem że łatwo nie jest, może w inny sposób?

Łącze dwie tabele poprzez UNION i wchodzi jak poniżej

Na obrazku widać że wszystkie dane się duplikują tylko potrzeba żeby było bez duplikacji i uzupełnione o zaznaczoną kolumnę.

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