Info relazione tabelle

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Buonasera a tutti, sto tenendo vivo questo forum con i miei dubbi e problemi :p. Volevo chiedervi una cosa semplice semplice. Ho tre tabelle, abbastanza semplici, una con delle lavorazioni (id,nome...........ecc), unacon gli ordini (id_lavorazione pezzi_ordinati ecc ecc) e l'ultima con i rapportini di produzione (id_lavorazione, pz_prodotti ecc ecc)

La mia esigenza è quella di visualizzare tutti gli ordini del mese, e laddove trovo una produzione vado a sommare i pezzi prodotti e gli vado a scalare dal totale degl'ordini,al contrario, se non ho rapportini vado semplicemente a riportare i dati dell'ordine. La query che riporto di seguito funziona benissimo, ed ero soddisfattissimo, fino a quando mi sono accorto che se l'ordine non ha ALMENO un rapportino agganciato non viene visualizzato in tabella.

La query è la seguente:

SQL:
SELECT     ordini.id_ordine,
        ordini.id_lavorazione_ordine,       
        ordini.pezzi_ordine AS ordine,
        (ordini.pezzi_ordine-SUM(n_pz_ok)) AS differenza,
        SUM(riepoligo_lavorazioni.n_pz_ok)  AS tot,                         
        riepoligo_lavorazioni.n_pz_ok,
        SUM(riepoligo_lavorazioni.n_pz_ok)*lavorazioni.prezzo_lavorazione AS euro_prodotti,
        lavorazioni.cod_lavorazione,
        lavorazioni.pz_ora,
        lavorazioni.tipologia_lavorazione,       
       ((ordini.pezzi_ordine-SUM(n_pz_ok))* lavorazioni.prezzo_lavorazione) AS euro_mancanti

 FROM riepoligo_lavorazioni

 LEFT JOIN ordini ON ordini.id_lavorazione_ordine=riepoligo_lavorazioni.codice_lavorazione
 LEFT JOIN lavorazioni ON lavorazioni.id_lavorazione=ordini.id_lavorazione_ordine

 WHERE  MONTH(ordini.data_inizio_ordine)=MONTH(NOW())
 AND MONTH(riepoligo_lavorazioni.data_lavorazione)=MONTH(NOW())
 AND lavorazioni.tipologia_lavorazione=:tipo_ordine
 GROUP BY id_lavorazione_ordine

Il principio è semplice, ad inizio mese imposto gli ordini e man mano che vengono registrati i rapportini di lavorazione vado a scalare i pezzi totali da produrre.

Mi sapete dire dove sto sbagliando? ho fatto varie prove...ma niente.

Grazie a tutti
E
 
hai provato nelle 2 join a sostituire "left" con "full outer" ?
cosa succede ?
Marino ti aspettavo come al pane...se il mio mentore... In realtà ho provato tante soluzioni ma nessuna ha dato il risultato sperato... credo sia semplice ma mi sono perso...help meee please
 
hai provato nelle 2 join a sostituire "left" con "full outer" ?
cosa succede ?
Mi dà errore. Ma comunque credo...e dico credo che dovrei ricercare principalmente in "ordini" (from ordini) e da lì vedere se ho relazioni nella tabella dei rapportini (per vedere se ci sono lavorazioni per quel codice prodotto ed eventualmente sommare i pezzi prodotti). Cosa ne pensi?
 
quale ????


comunque prova

FULL OUTER JOIN ordini ON ordini.id_lavorazione_ordine=riepoligo_lavorazioni.codice_lavorazione
FULL OUTER lavorazioni ON lavorazioni.id_lavorazione=ordini.id_lavorazione_ordine

cosa succede ?
Mi dava errore di sintassi prima di outer. Comunque appena rientro faccio altro test e ti aggiorno. Ma la logica è corretta secondo te? Ho il dubbio sulla "From"… ma non riesco a venirne fuori, eppure credo sia semplice come principio.
Grazie infinite per l'aiuto
E
 
posta la struttura delle tabelle e alcuni record d'esempio in modo da provare il codice

per chiarezza,
ordini : sono gli ordini dei materiali da produrre
lavorazioni : sono tutte le lavorazioni necessarie ad ottenere un materiale finito
riepoligo_lavorazioni : sono i materiali già prodotti

da ultimo
le relazioni tra ordini -> lavorazioni
le relazioni tra ordini -> riepoligo_lavorazioni
le relazioni tra lavorazioni -> riepoligo_lavorazioni
 
Tab. Lavorazioni (contiene i dettagli delle lavorazioni)
id_lavorazioni
tipologia_lavorazione
cod_lavorazione
pz_ora

Tab. Ordini (contiene gli ordini mensili)
id_ordine
id_lavorazione_ordine
pezzi_ordine
data_inizio_ordine

Tab. Riepilogo_lavorazioni (contiene i rapportini dei dipendenti giornalieri)
data_lavorazione
tipologia_lavorazione
codice_lavorazione
n_pz_ok
n_pz_ko



Tab Lavorazioni tab ordini Tab Riepilogo_lavorazioni
00000001 215648569 01/01/2023
fin_man 00000001 fin_man
1xtn000005 1000 1xtn000005
25 01/09/2023 200


Spero si capisca il concetto.

Grazie mille
E

o postato 1 estratto delle tabelle. Spero di risolvere questo problema. Pensavo fosse una banalità... perdona il disturbo
E
 
Forse cosi ti è tutto piu semplice, ti allego il codice sql per la creazione delle tabelle, spero che riesci ad aiutarmi
 

Allegati

1695037155359.png

ho estratto tutte le colonne delle 3 tabelle in modo che tu le possa controllare,
con questa query

SQL:
select
  o.id_ordine              as o_id_ordine
, o.id_lavorazione_ordine  as o_id_lavorazione_ordine
, o.pezzi_ordine           as o_pezzi_ordine
, o.data_inizio_ordine     as o_data_inizio_ordine
, l.id_lavorazioni         as l_id_lavorazioni
, l.tipologia_lavorazione  as l_tipologia_lavorazione
, l.cod_lavorazione        as l_cod_lavorazione
, l.pz_ora                 as l_pz_ora
, r.tipologia_lavorazione  as r_tipologia_lavorazione
, r.codice_lavorazione     as r_codice_lavorazione
, sum (r.n_pz_ok)          as n_pz_ok
, sum (r.n_pz_ko)          as n_pz_ko
from @Lavorazioni l
left join @Riepilogo_lavorazioni r
on l.tipologia_lavorazione = r.tipologia_lavorazione and l.cod_lavorazione = r.codice_lavorazione
and r.data_lavorazione BETWEEN '2023-01-01' AND '2023-12-31'
left join @ordini o
on l.id_lavorazioni = o.id_lavorazione_ordine
group by
  o.id_ordine
, o.id_lavorazione_ordine
, o.pezzi_ordine
, o.data_inizio_ordine
, l.id_lavorazioni
, l.tipologia_lavorazione
, l.cod_lavorazione
, l.pz_ora
, r.tipologia_lavorazione
, r.codice_lavorazione
 
Vedi l'allegato 8212
ho estratto tutte le colonne delle 3 tabelle in modo che tu le possa controllare,
con questa query

SQL:
select
  o.id_ordine              as o_id_ordine
, o.id_lavorazione_ordine  as o_id_lavorazione_ordine
, o.pezzi_ordine           as o_pezzi_ordine
, o.data_inizio_ordine     as o_data_inizio_ordine
, l.id_lavorazioni         as l_id_lavorazioni
, l.tipologia_lavorazione  as l_tipologia_lavorazione
, l.cod_lavorazione        as l_cod_lavorazione
, l.pz_ora                 as l_pz_ora
, r.tipologia_lavorazione  as r_tipologia_lavorazione
, r.codice_lavorazione     as r_codice_lavorazione
, sum (r.n_pz_ok)          as n_pz_ok
, sum (r.n_pz_ko)          as n_pz_ko
from @Lavorazioni l
left join @Riepilogo_lavorazioni r
on l.tipologia_lavorazione = r.tipologia_lavorazione and l.cod_lavorazione = r.codice_lavorazione
and r.data_lavorazione BETWEEN '2023-01-01' AND '2023-12-31'
left join @ordini o
on l.id_lavorazioni = o.id_lavorazione_ordine
group by
  o.id_ordine
, o.id_lavorazione_ordine
, o.pezzi_ordine
, o.data_inizio_ordine
, l.id_lavorazioni
, l.tipologia_lavorazione
, l.cod_lavorazione
, l.pz_ora
, r.tipologia_lavorazione
, r.codice_lavorazione
Marino GRAZIE infinite...nel pomeriggio provo e ti faccio sapere.
 
scusa ho dimenticato di togliere le chioccioline
@Lavorazioni
@Riepilogo_lavorazioni
@ordini
i nomi delle tre tabelle devono essere scritti senza le chioccioline
Lavorazioni
Riepilogo_lavorazioni
ordini
ciascuno seguito dal rispettivo alias come indicato nella query
 
scusa ho dimenticato di togliere le chioccioline
@Lavorazioni
@Riepilogo_lavorazioni
@ordini
i nomi delle tre tabelle devono essere scritti senza le chioccioline
Lavorazioni
Riepilogo_lavorazioni
ordini
ciascuno seguito dal rispettivo alias come indicato nella query
Grazie avevo già provveduto a sistemare. Funziona...ma mi tira fuori tutto i rek della tabella lavorazioni...io dovrei "pescare" da ordini. Sto facendo delle prove ma non va...
 
"pescare" da ordini
come ?
fai un esempio con 3-4 ordini

devi modificare anche
and r.data_lavorazione BETWEEN '2023-01-01' AND '2023-12-31'

ed eventualmente inserire un filtro per
o.data_inizio_ordine

esiste una chiave ordine su Riepilogo_lavorazioni in modo da non dover passare da lavorazioni ?
 
SQL:
SELECT  ordini.id_ordine,
        ordini.id_lavorazione_ordine,       
        ordini.pezzi_ordine AS ordine,
        (ordini.pezzi_ordine-SUM(n_pz_ok)) AS differenza,
        SUM(riepoligo_lavorazioni.n_pz_ok)  AS tot,                         
        riepoligo_lavorazioni.n_pz_ok,
        SUM(riepoligo_lavorazioni.n_pz_ok)*lavorazioni.prezzo_lavorazione AS euro_prodotti,
        lavorazioni.cod_lavorazione,
        lavorazioni.pz_ora,
        lavorazioni.tipologia_lavorazione,       
       ((ordini.pezzi_ordine-SUM(n_pz_ok))* lavorazioni.prezzo_lavorazione) AS euro_mancanti

 FROM ordini

   LEFT  JOIN riepoligo_lavorazioni ON ordini.id_lavorazione_ordine=riepoligo_lavorazioni.codice_lavorazione
            and ordini.data_inizio_ordine BETWEEN '2023-01-01' AND '2023-12-31'
   LEFT JOIN lavorazioni ON ordini.id_lavorazione_ordine =lavorazioni.id_lavorazione
             AND MONTH(riepoligo_lavorazioni.data_lavorazione)=MONTH(NOW())
    
 GROUP BY id_lavorazione_ordine

Marino partendo dalla tua sono arrivato a questo... e Funziona... dovrei solo dividere i dati per lavorazioni.tipologia_lavorazione. In pratica su una pagina voglio vedere solo gli ordini che fanno parte dalla "fin_man" (Finitura Manuale) e su 1 altra pagina solo gli ordini per "assiemaggio". Queste due tipologie di lavoro sono riportate sulla tabella lavorazioni.

Ci sei quasiiii

grazie infinite!!! (ho mal di testa) :)
 
"fin_man" (Finitura Manuale) e su 1 altra pagina solo gli ordini per "assiemaggio"
puoi eseguire la query due volte inserendo ciascuna volta il filtro con la tipologia che ti serve

puoi fare anche una

select * from
(
qui metti la query del tuo ultimo post
) tab
where e qui metti il filtro


oppure puoi provare con "order by" se é sufficiente
 
Ultima modifica:

Discussioni simili