Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    6

    [MySql] Sum(Case), eliminare i duplicati con DISTINCT

    Ciao a tutti.
    All'interno di una tabella che contiene ordini e fatture, devo sommare il valore delle fatture registrate in un dato periodo di tempo.

    Ogni fattura però può fare riferimento a più ordini, e nella riga corrispondente all'interno del database viene riportato l'importo totale della fattura.

    Prendiamo come esempio questa base di dati:

    Tipologia NOrdine FatturaId ImportoFattura
    O 109 600102 30€
    O 110 600102 30€
    O 111 600565 70€

    Inizialmente avevo fatto così:

    codice:
    SELECT SUM (CASE WHEN FGSPORT_TA_TESTATA_ORDINI_ACQ.Tipologia = 'O' AND SBI_TA_TESMOV.ImportoFattura > 0  THEN SBI_TA_TESMOV.ImportoFattura END)  ) AS SommaFatturato 
    
    ecc ecc, altri sum case per altre voci
    
    FROM 
    
    una tabella generata effettuando join tra più tabelle
    
    GROUP BY
    
    alcune voci
    ...ma se ho una fattura che comprende più ordini come scritto anche sopra, queste righe ordine mi vengono duplicate.

    In soldoni: SommaFatturato così mi risulta essere 130 quando dovrebbe essere 100.


    Come posso integrare una clausola DISTINCT che non consideri i duplicati di FatturaId all'interno di questo SUM (CASE) già sufficentemente nidificato?


    Grazie mille per il vostro aiuto.

  2. #2
    Hai gia' il group by che raggruppa. Se raggruppi solo per fattura_id sommera' solo le fatture con lo stesso id

    Pero' per una sola condizione preferirei usare IF() al posto di CASE() es:

    codice:
    SELECT SUM(IF(FGSPORT_TA_TESTATA_ORDINI_ACQ.Tipologia = 'O' 
                         AND  SBI_TA_TESMOV.ImportoFattura > 0,
                         SBI_TA_TESMOV.ImportoFattura, 0)) AS SommaFatturato 
    ...
    
    GROUP BY fattura_id

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    6
    Non posso usare GROUP BY Fattura_Id perchè nella SELECT ci sono diverse sum da effettuare, ho postato solo la prima, che riguardando anche altri campi (come le quantità ricevute e i tempi di consegna).
    Pertanto, se non erro, piazzando un bel GROUP BY Fattura_Id in fondo alla SELECT raggrupperei i campi della prima SUM per il numero di fattura, quando ci sarebbero invece alcune SUM che dovrebbero essere raggruppate con altri campi.

    Ecco perchè mi sono messo in testa di trovare il modo di usare un DISTINCT per ogni SUM, iniziando a provare dalla prima SUM..

    La query completa,che inizialmente non avevo postato per non aumentare la confusione di chi legge, sarebbe così:


    SELECT *, SommaFatturato + SommaTrasferimenti + SommaOrdini + SommaRDAdef + SommaRDAprov + 0 AS Totale FROM (

    SELECT SUM (DISTINCT SBI_TA_TESMOV.FatturaId (CASE WHEN FGSPORT_TA_TESTATA_ORDINI_ACQ.Tipologia = 'O' AND SBI_TA_TESMOV.ImportoFattura > 0 THEN SBI_TA_TESMOV.ImportoFattura END) ) AS SommaFatturato ,
    SUM (CASE WHEN SBI_TA_TESMOV.ImportoFattura Is Null AND FGSPORT_TA_TESTATA_ORDINI_ACQ.Tipologia = 'M' AND month(FGSPORT_TA_RIGHE_ORDINI_ACQ.DataConsegna) <= (datepart (month,GETDATE())) THEN FGSPORT_TA_RIGHE_ORDINI_ACQ.TotRigaEuro ELSE 0 END) AS SommaTrasferimenti,
    SUM (CASE WHEN SBI_TA_TESMOV.ImportoFattura Is Null AND FGSPORT_TA_TESTATA_ORDINI_ACQ.Tipologia = 'O' AND month(FGSPORT_TA_RIGHE_ORDINI_ACQ.DataConsegna) <= (datepart (month,GETDATE())) THEN FGSPORT_TA_RIGHE_ORDINI_ACQ.TotRigaEuro ELSE 0 END) AS SommaOrdini,
    SUM (CASE WHEN SBI_TA_TESMOV.ImportoFattura Is Null AND FGSPORT_TA_TESTATA_ORDINI_ACQ.Tipologia = 'R' AND FGSPORT_TA_TESTATA_ORDINI_ACQ.IsDefinitivo = '1' AND month(FGSPORT_TA_RIGHE_ORDINI_ACQ.DataConsegna) <= (datepart (month,GETDATE())) THEN FGSPORT_TA_RIGHE_ORDINI_ACQ.TotRigaEuro ELSE 0 END) AS SommaRDAdef,
    SUM (CASE WHEN FGSPORT_TA_TESTATA_ORDINI_ACQ.IsDefinitivo = '0' THEN FGSPORT_TA_RIGHE_ORDINI_ACQ.TotRigaEuro ELSE 0 END) AS SommaRDAprov,
    FGSPORT_TA_PROGRAMMI.DescrProgramma,
    FGSPORT_TA_VOCI.DescrizioneVoce,
    FGSPORT_TA_TESTATA_ORDINI_ACQ.AnnoBudget


    FROM FGSPORT_TA_RIGHE_ORDINI_ACQ
    INNER JOIN FGSPORT_TA_TESTATA_ORDINI_ACQ ON FGSPORT_TA_TESTATA_ORDINI_ACQ.OrdineId = FGSPORT_TA_RIGHE_ORDINI_ACQ.OrdineId
    INNER JOIN FGSPORT_TA_PROGRAMMI ON FGSPORT_TA_PROGRAMMI.ProgrammaId = FGSPORT_TA_RIGHE_ORDINI_ACQ.ProgrammaId
    INNER JOIN FGSPORT_TA_VOCI ON FGSPORT_TA_RIGHE_ORDINI_ACQ.VoceId = FGSPORT_TA_VOCI.VoceId
    LEFT OUTER JOIN SBI_TA_NEWMOV ON FGSPORT_TA_RIGHE_ORDINI_ACQ.RigaOrdineId = SBI_TA_NEWMOV.RigaOrdineId
    LEFT OUTER JOIN SBI_TA_TESMOV ON SBI_TA_TESMOV.RicevimentoMerceId = SBI_TA_NEWMOV.RicevimentoMerceId



    GROUP BY FGSPORT_TA_PROGRAMMI.DescrProgramma, FGSPORT_TA_VOCI.DescrizioneVoce, FGSPORT_TA_TESTATA_ORDINI_ACQ.AnnoBudget

    ) AS a;

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2003
    Messaggi
    6
    uppo (se possibile) il thread per chiedere se qualcuno ha delle idee in merito..

  5. #5
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da goro83
    uppo (se possibile) il thread per chiedere se qualcuno ha delle idee in merito..
    Prova con delle subquery, tipo
    codice:
    SELECT (select sum(valore) from ...), (select sum(valore) from ...)
    FROM fattura

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 © 2024 vBulletin Solutions, Inc. All rights reserved.