Problema query

di il
28 risposte

28 Risposte - Pagina 2

  • Re: Problema query

    Prova [Code]SELECT T1.CMSAEO1, T1.CDAREO1, T1.CDFAEO1, T1.CDFOEO1, T2.CDFOEO1 FROM DEN90DAT_LEMOO01F AS T1 INNER JOIN DEN90DAT_LEMOO01F AS T2 ON T1.NROREO1 = T2.NROREO1 AND T1.CMSAEO1 = T2.CMSAEO1 AND T1.CDAREO1 = T2.CDAREO1 WHERE T1.CMSAEO1="B3735" AND T1.CDFAEO1="050" AND T1.CDFOEO1<>T2.CDFOEO1 GROUP BY T1.CMSAEO1, T1.CDAREO1, T1.CDFAEO1 Copia e incolla ed esegui...
  • Re: Problema query

    Innazitutto grazie per la pazienza e soprattutto perchè mi hai fatto capire l'utilizzo della funzione dove di access.
    Copiando il codice, in struttura ottengo questo:



    Ora, nella colonna 3 e 4 chiaramente cambio da Espressione a Raggruppamento, la query non va in errore, ma non mi restituisce alcun record.

    Questo adesso sembra strano in quanto raggruppo per Codice, Commessa, Fase dove Il fornitore (CDFOEO1) di tabella T2 è <> da quello di T1.
  • Re: Problema query

    No, non serve il raggruppamento. Errore mio che ho lasciato il GROUP BY... Lascia il valore "Espressione"
  • Re: Problema query

    Non ci sono ancora, esempio con fornitore T1 <> da T2 e esempio con fornitore =.



    Credo che l'unica soluzione sia la concatenazione di Allen Browne.
  • Re: Problema query

    Sicuramente la funzione è molto più potente e flessibile. Ma se lo scenario è solo a due fornitori, la query funziona. C'è qualcosa che ci sfugge nel tuo scenario specifico.

    Se parto da una tabella con questi dati:
    
    ID	Codice	Commessa	Fornitore
    1	1	X		A
    2	1	X		B
    3	2	Y		A
    4	3	Z		A
    5	3	Z		B
    e applico una query strutturata così:
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore
    FROM Tabella1 AS TA
    LEFT JOIN Tabella1 AS TB ON (TA.Fornitore <> Tb.Fornitore) AND (TA.Codice = TB.Codice) AND (TA.Commessa = TB.Commessa)
    WHERE TA.Fornitore = "A";
    ottengo questo output:
    
    Codice	Commessa	TA.Fornitore	TB.Fornitore
    1	X		A		B
    2	Y		A	
    3	Z		A		B
    che è esattamente quel che stai cercando... Avendo tu tante colonne nella tabella, sicuramente il join non fa quello che ci si aspetta. Dato che Access ti permette di trattare le query come una vista, prova aggiungendo ancora un passaggio intermedio: prima crei una query che estrapola solo e soltanto le colonne che a te interessano (penso che siano CMSAEO1, CDAREO1, CDFAEO1, CDFOEO1 e CDFOEO1). Poi, in una seconda Query, esegui una "select sulla query in join con la query"
    In breve, nell'istruzione SQL che ho postato poco sopra, sostituisci il nome della tabella con quello della query, sia dopo il FROM che dopo il LEFT JOIN.
  • Re: Problema query

    Allora, ho provato a copiare la tua sql su una tabella creata in access con questi campi: codice commessa fornitore e fase.
    Funziona correttamente (anche se quando passo in visualizzazione struttura ottengo il messaggio che vedi sotto ma credo sia del tutto ininfluente infatti rispondendo ok al messaggio la query funziona e non apporta alcuna modifica alla sql).

    Sql funzionante con immagine risultato
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore
    FROM Tabella1 AS TA
    LEFT JOIN Tabella1 AS TB ON (TA.Fornitore <> TB.Fornitore) AND (TA.Codice = TB.Codice) AND (TA.Commessa = TB.Commessa) AND (TA.Fase = TB.Fase)
    WHERE TA.Fornitore = "2401002722";
    


    Grazie al tuo aito ho capito che la funzione di where crea il problema. Quando? Quando invece di scriverla a mano sulla sql la metto dritta in struttura, qui sono ancora ok (sql con aggiunta a mano della condizione where sulla commessa)
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore
    FROM Tabella1 AS TA
    LEFT JOIN Tabella1 AS TB ON (TA.Fornitore <> TB.Fornitore) AND (TA.Codice = TB.Codice) AND (TA.Commessa = TB.Commessa) AND (TA.Fase = TB.Fase)
    WHERE TA.Fornitore = "2401002722" and TA.Commessa= 'B3735';
    

    Condizione di where messa in struttura: (qui il risultato è che non ho più il raggruppamento per codice!!!!!)
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore
    FROM Tabella1 AS TA LEFT JOIN Tabella1 AS TB ON (TA.Fase = TB.Fase) AND (TA.Commessa = TB.Commessa) AND (TA.Codice = TB.Codice)
    WHERE (((TA.Commessa)="B3735") AND ((TA.Fornitore)="2401002722"));
    
    Quindi la query di selezione funziona ho il dubbo però che adesso, trasformandola in query di creazione tabella, mi ritorni il problema iniziale.

    E difatti il mio momento di gasamento finisce subito, ottengo la tabella con i codici non raggruppati in riga.
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore INTO Prova
    FROM Tabella1 AS TA 
    LEFT JOIN Tabella1 AS TB ON (TA.Fase = TB.Fase) AND (TA.Commessa = TB.Commessa) AND (TA.Codice = TB.Codice)
    WHERE TA.Fornitore="2401002722"
    
  • Re: Problema query

    Sono abbastanza sicuro che non sia la WHERE ma la JOIN...

    Assicurati che in:
    Visualizzazione Struttura -> Progettazione
    il pulsante dei totali sia disabilitato. Reincolla la query funzionante e salva. Ora passando tra le diverse visualizzazioni non dovrebbe più dare il problema
  • Re: Problema query

    Ed avevi ragione ancora una volta, il problema era la JOIN ovviamente......sono arrivato a quello che mi serviva (almeno spero, perchè con il passare dei giorni ho perso il focus.... )

    A parte gli scherzi ho notato che se dalla query di selezione, passavo a query creazione tabella e viceversa, nella mia istruzione sql access troncava questo:
    AND (DEN90DAT_LEMOO01F.CDFOEO1 <> DEN90DAT_LEMOO01F_1.CDFOEO1)
    Ovvio che non raggruppava righe e oltretutto mi dava lo stesso fornitore nelle 2 colonne........

    Ora dovrei essere in grado, nel report che ottengo alla fine della fiera, avendo in questo report il campo dove sta scritto il fornitore del conto lavoro di gestire il caso:
    Se A scrivi A
    Se B scrivi B

    Se a e B scrivi C

    Altrimenti aggiungo altro campo e la finisco qui.

    Grazie 1000.
  • Re: Problema query

    Niente da fare, troppo stringente la casistica; ora mi accorgo che funziona chiaramente solo per il fornitore A perchè con questa condizione di WHERE
     WHERE (((DEN90DAT_LEMOO01F.CMSAEO1)="B4704") AND ((DEN90DAT_LEMOO01F.CDAREO1)<>"ORD") AND ((DEN90DAT_LEMOO01F.CDFAEO1)="050") AND ((DEN90DAT_LEMOO01F.CDFOEO1)="2401002722"));
    ottengo ovviamente solo i codici che soddisfano la condizione che il fornitore sia uguale a 2401002722 (20 record)

    con questa condizione
    WHERE (((DEN90DAT_LEMOO01F.CMSAEO1)="B4704") AND ((DEN90DAT_LEMOO01F.CDAREO1)<>"ORD") AND ((DEN90DAT_LEMOO01F.CDFAEO1)="050") AND ((DEN90DAT_LEMOO01F.CDFOEO1)="2401002639"));
    ottengo ovviamente solo i codici che soddisfano la condizione che il fornitore sia uguale a 2401002639 (33 record)

    Se, per ottenere tutti i record, tolgo i fornitori dalla where, ovviamente nel caso abbia i 2 fornitori a parita di codice/commesssa/fase torna a duplicare la riga.....

  • Re: Problema query

    superkairo ha scritto:


    ora mi accorgo che funziona chiaramente solo per il fornitore A
    Ah ma io ti avevo avvisato da subito

    Certo è che se ti titrovi ad avere solo due fornitori puoi usare un UNION e accodare una seconda query, simile alla prima, differente solo per il fornitore filtrato.

    Bisognerà probabilmente gestire il fatto di nuovo duplicherà i record perché ti troverai:
    Codice	Commessa	TA.Fornitore	TB.Fornitore
    1	X		A		B
    2	Y		A	
    3	Z		A		B
    1	X		B		A  <-- Duplicato
    3	Z		B		A  <-- Duplicato
    4       W               B
    Ma giocando un po' con la WHERE della seconda te la cavi. Magari, se i record hanno id univoci, puoi escluderli con una NOT IN ad esempio:
    
    SELECT * FROM Tabella WHERE Fornitore = A
    UNION
    SELECT * FROM tabella WHERE Id_Record NOT IN (SELECT Id_Record FROM Tabella WHERE Fornitore = A) AND Fornitore = B
    È solo una bozza per rendere l'idea di come funziona, ma potrebbe essere applicabile alla tua situazione...
  • Re: Problema query

    Diciamo che dovrei arrivare circa qui ( script di qlik view)
    SQL SELECT *
    FROM GAMOV01J LEFT JOIN MGART00F ON CDARAO=CDARMA
    WHERE CDDTAO='01' and dtrcao>=20070101
    union 
    SELECT *
    FROM GABKM01J LEFT JOIN MGART00F ON CDARAO=CDARMA
    WHERE CDDTAO='01'  and dtrcao>=20070101;
    
    Domani se ho tempo mi metto...
  • Re: Problema query

    Hai provato a sostituire i DOPPI APICI con APICI SINGOLI...

    Per capirci... questo:
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore INTO Prova
    FROM Tabella1 AS TA 
    LEFT JOIN Tabella1 AS TB ON (TA.Fase = TB.Fase) AND (TA.Commessa = TB.Commessa) AND (TA.Codice = TB.Codice)
    WHERE TA.Fornitore="2401002722"
    Lo proverei a modificare cosi:
    SELECT TA.Codice, TA.Commessa, TA.Fornitore, TB.Fornitore INTO Prova
    FROM Tabella1 AS TA 
    LEFT JOIN Tabella1 AS TB ON (TA.Fase = TB.Fase) AND (TA.Commessa = TB.Commessa) AND (TA.Codice = TB.Codice)
    WHERE TA.Fornitore='2401002722'
    Se il campo fornitore fosse numero senza nulla...
  • Re: Problema query

    Appena provato, il campo fornitore è testo breve, cambiano gli apici non ottengo nulla di diverso. Nel dubbio ho provato anche a crearmi una tabella con campo fornitore numerico, per me non cambia niente. Anche perchè ho il dubbio che la condizione di where mi escluda l'altro fornitore, ovvero se gli ordini sono fatti solo al fornitore non 2401002722, la query non dovrebbe restituire alcun record.

    Provo a fare la union ed escludere dalla where come suggerito.
  • Re: Problema query

    Sgrubak ha scritto:


    superkairo ha scritto:


    ora mi accorgo che funziona chiaramente solo per il fornitore A
    Ah ma io ti avevo avvisato da subito

    Certo è che se ti titrovi ad avere solo due fornitori puoi usare un UNION e accodare una seconda query, simile alla prima, differente solo per il fornitore filtrato.

    Bisognerà probabilmente gestire il fatto di nuovo duplicherà i record perché ti troverai:
    Codice	Commessa	TA.Fornitore	TB.Fornitore
    1	X		A		B
    2	Y		A	
    3	Z		A		B
    1	X		B		A  <-- Duplicato
    3	Z		B		A  <-- Duplicato
    4       W               B
    Ma giocando un po' con la WHERE della seconda te la cavi. Magari, se i record hanno id univoci, puoi escluderli con una NOT IN ad esempio:
    
    SELECT * FROM Tabella WHERE Fornitore = A
    UNION
    SELECT * FROM tabella WHERE Id_Record NOT IN (SELECT Id_Record FROM Tabella WHERE Fornitore = A) AND Fornitore = B
    È solo una bozza per rendere l'idea di come funziona, ma potrebbe essere applicabile alla tua situazione...
    Ho provato stamattina a rimetterci mano, e la prima cosa che ho verificato è se ho un campo che mi renda il record univoco.
    Diciamo che potrebbe essere il numero ordine conto lavoro (NROREO1) da qui:
    SELECT DEN90DAT_LEMOO01F.NROREO1, DEN90DAT_LEMOO01F.CDAREO1, DEN90DAT_LEMOO01F.CMSAEO1, DEN90DAT_LEMOO01F.CDFOEO1, DEN90DAT_LEMOO01F.CDFOEO1 FROM DEN90DAT_LEMOO01F WHERE CDFOEO1 = '2401002722' AND CMSAEO1= 'B3735';
    UNION
    SELECT DEN90DAT_LEMOO01F.NROREO1, DEN90DAT_LEMOO01F.CDAREO1, DEN90DAT_LEMOO01F.CMSAEO1, DEN90DAT_LEMOO01F.CDFOEO1, DEN90DAT_LEMOO01F.CDFOEO1 FROM DEN90DAT_LEMOO01F WHERE NROREO1 NOT IN (SELECT NROREO1 FROM DEN90DAT_LEMOO01F WHERE CDFOEO1='2401002722') AND CDFOEO1= '2401002639' AND CMSAEO1= 'B3735';
    
    
    Anche in questo caso ottengo i record duplicati, chiedo quindi se ho un modo di tradurre per access una cosa del genere:

    data:
    LOAD * ;
    SELECT
    NROREO1, 
    CDAREO1,
    CMSAEO1,
    CDFOEO1
    FROM LEMOO01F WHERE CMSAEO1= 'B3735';
    
    NoConcatenate
    data1:
    LOAD
    	CMSAEO1,CDAREO1,
    	SubField(CDFOEO1,' - ',1)				as CDFOEO1_1,
    	SubField(CDFOEO1,' - ',2)				as CDFOEO1_2;
    LOAD CMSAEO1,CDAREO1, Concat(CDFOEO1,' - ')	as CDFOEO1
    Resident data
    Group By CMSAEO1,CDAREO1;
    
    DROP Table data;
    O sbaglio ancora la condizione di where del primo esempio?
Devi accedere o registrarti per scrivere nel forum
28 risposte