Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [sql] Unire tabella parzialmente popolata in join

    Prima di tutto un saluto da un nuovo membro
    Chi mi può dare un'idea?
    Ho la seguente Select che non funziona come vorrei

    SELECT
    DISTINCT(venduto.cli_id) AS id,
    clienti.des1,
    target_cli.target,
    SUM(venduto. cc_prz_sc * venduto.cc_tot_btg) AS vend,
    SUM(venduto. cc_prz_sc * venduto.cc_tot_btg) - target_cli.target AS diff
    FROM clienti
    INNER JOIN venduto ON clienti.id = venduto.cli_id
    INNER JOIN target_cli ON clienti.id = target_cli.id_cli
    WHERE venduto.cc_data >='2009-01-01'
    AND venduto.cc_data <='2009-12-31'
    AND target_cli.anno = '2009'
    GROUP BY clienti.des1

    Il problema è che la tabella target_cli non è del tutto popolata
    quindi nel risultato della SELCT mi mancano tutti i record
    non popolati nella tabella target_cli, mentre vorrei avere tutti
    i record e sostituire il campo target inesistente con target = 0

    Grazie mille
    Saluti
    Alby

  2. #2
    prova con left join. Riceverai un NULL.

    LEFT JOIN target_cli ON clienti.id = target_cli.id_cli

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Nulla di fatto
    Anche con il LEFT mi vengono restituiti solo 2 record
    (id cliente che popolano la tabella target_cli)
    Hai altre idee ?!
    Saluti
    Alby

  4. #4
    Originariamente inviato da albyjkl
    Nulla di fatto
    Anche con il LEFT mi vengono restituiti solo 2 record
    (id cliente che popolano la tabella target_cli)
    Hai altre idee ?!
    togliere il distinct.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Non posso toglierlo, ho bisogno di raggruppare tutto
    su un unico id, se lo togliessi mi ritroverei n° record
    per le n° linee della tab. venduto.
    Potrei fare una procedura all'ingresso della pagina
    che va a testare le righe in target_cli e popola le mancanti
    ma mi sembrava più semplice tramite Sql invece .....
    Saluti
    Alby

  6. #6
    hai una incongruenza secondo me .... l'uso di DISTINCT e di GROUP BY.

    Il DISTINCT si estende a tutto il record set e non solo al venduto.cli_id

    Se poi il target_cli non ha tutte le relazioni in clienti devi per forza di cose usare LEFT JOIN se vuoi raccogliere tutti i record di clienti

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Bho !!
    Se pulisco da DISTINCT e GROUP BY la procedura mi restituisce un record solo
    Addirittura la stessa procedura in CocoaMySql mi va in errore col seguente mess.
    Mixing of GROUP columns (MIN(), MAX(),COUNT() ....) with no GROUP columns is illegal if thereis no
    GROUP BY clause
    Saluti
    Alby

  8. #8
    Originariamente inviato da albyjkl
    Bho !!
    Se pulisco da DISTINCT e GROUP BY la procedura mi restituisce un record solo
    Addirittura la stessa procedura in CocoaMySql mi va in errore col seguente mess.
    Mixing of GROUP columns (MIN(), MAX(),COUNT() ....) with no GROUP columns is illegal if thereis no
    GROUP BY clause
    chi ti ha detto di togliere il group by???? riassumendo ti ho suggerito:

    1) usa left join
    2) togli distinct

    E per quanto riguarda le tabelle lo sai solo tu cosa contengono.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Ho provato a semplificarlo così ma nulla
    1 solo record che corrisponde all'unico in join
    della tabella target_cli

    SELECT
    venduto.cli_id,
    target_cli.target
    FROM venduto
    LEFT JOIN target_cli ON venduto.cli_id = target_cli.id_cli
    WHERE venduto.cc_data >='2009-01-01'
    AND venduto.cc_data <'2009-12-01'
    AND target_cli.anno = '2009'
    GROUP BY venduto.cli_id
    Saluti
    Alby

  10. #10

    Re: [sql] Unire tabella parzialmente popolata in join

    Originariamente inviato da albyjkl
    SELECT
    DISTINCT(venduto.cli_id) AS id,
    clienti.des1,
    target_cli.target,
    SUM(venduto. cc_prz_sc * venduto.cc_tot_btg) AS vend,
    SUM(venduto. cc_prz_sc * venduto.cc_tot_btg) - target_cli.target AS diff
    FROM clienti
    INNER JOIN venduto ON clienti.id = venduto.cli_id
    INNER JOIN target_cli ON clienti.id = target_cli.id_cli
    WHERE venduto.cc_data >='2009-01-01'
    AND venduto.cc_data <='2009-12-31'
    AND target_cli.anno = '2009'
    GROUP BY clienti.des1
    torniamo a bomba.... non devi cambiare le carte in tavola. Qui dici:
    Il problema è che la tabella target_cli non è del tutto popolata
    quindi nel risultato della SELCT mi mancano tutti i record
    non popolati nella tabella target_cli, mentre vorrei avere tutti
    i record e sostituire il campo target inesistente con target = 0
    dimmi che c'entra:

    codice:
    FROM venduto
    LEFT JOIN target_cli
    eventualmente la tua query dovrebbe essere: (dico eventualmente perche' nessuno all'infuori di te conosce la struttura di questo db)

    codice:
    SELECT
    venduto.cli_id AS id,
    clienti.des1,
    target_cli.target,
    SUM(venduto.cc_prz_sc * venduto.cc_tot_btg) AS vend,
    SUM(venduto.cc_prz_sc * venduto.cc_tot_btg) - target_cli.target AS diff
    FROM clienti
    LEFT JOIN venduto ON clienti.id = venduto.cli_id
    LEFT JOIN target_cli ON clienti.id = target_cli.id_cli
    WHERE venduto.cc_data between '2009-01-01' AND '2009-12-31'
    AND target_cli.anno = '2009'
    GROUP BY clienti.des1
    clienti.des1 cos'e' ??? forse dovresti usare clienti.id ???

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.