SQL - Utilizzo di DISTINCT all'interno di SUM (o soluzione tecnica equ...

martedì 26 giugno 2012 - 13.30

goro83 Profilo | Newbie

Buongiorno,
ho una tabella tbl impostata per esempio così:

tbl
Filiale - Voce di Spesa - Ordine - Fattura - ImportoFattura
Roma - Pere - 1 - 100 - 5000
Roma - Pere - 2 - 100 - 5000
Roma - Mele - 3 - 150 - 2500
Milano - Mele - 1 - 138 - 6000
Milano - Mele - 2 - 138 - 6000

Questa tabella contiene tutti gli ordini di merce fatti da tutte le filiali.
Una fattura può essere relativa a più ordini (es. la fattura numero 100 che fa riferimento agli ordini 1 e 2 di Roma), ma all'interno del database l'importo complessivo viene riportato su tutte le righe.

Ho la necessità di sommare l'importo di tutte le fatture emesse su ciascuna filiale, a seconda della Voce di Spesa.

Dovrei ottenere pertanto il seguente risultato con una unica query:

SommadiRomaPere: 5000
SommadiRomaMele: 2500
SommadiMilanoMele: 6000

..mentre con tutte le soluzioni provate fino a questo momento ottengo, sempre con i dati dell'esempio:

SommadiRomaPere: 10000
SommadiRomaMele: 2500
SommadiMilanoMele: 12000

..poichè le fatture che fanno riferimento a più ordini vengono in ogni caso sommate una volta per ciascun ordine di riferimento.

Sono abbastanza alle prime armi, GROUP BY non mi è servito a nulla (posso solo ottenere una selezione delle fatture uniche, ma non una somma..) so dell'esistenza di DISTINCT ma non riesco a farlo "incastrare" all'interno di uno statement che funzioni..

E' fattibile tutto questo?
Faccio notare che non ho possibilità di mettere mano alla struttura del database per renderlo più funzionale purtroppo; devo esclusivamente lavorare su queste query per fini statistici.

Grazie a chi proverà a darmi una mano

boccia75 Profilo | Junior Member

Ciao!
Quella tabella non è particolarmente utile...
O meglio: è utile per ottenere gli ordini, ma dannosa per ottenere gli importi delle fatture.
La tabella in essere potrebbe essere anche corretta, a patto di NON inserire l'importo della fattura ma appoggiandosi ad un'altra tabella (tabella FATTURE) avente nel tracciato record il numero di fattura e l'importo.
Ma tant'è...e quindi ecco la mia soluzione :
questa è la tua tabella ordini

ROMA PERE 1 100 5000
ROMA PERE 2 100 5000
ROMA MELE 3 150 2500
MILANO MELE 1 138 6000
MILANO MELE 2 138 6000
ROMA PERE 4 120 5000
ROMA PERE 5 120 5000

(ho inserito un'ulteriore fattura di pere per roma avente LO STESSO IMPORTO DELLA TUA)

il risultato da ottenere è questo:
6000 MILANO MELE
2500 ROMA MELE
10000 ROMA PERE

che otteniamo con questa query:

;
with tbl_cte (
FILIALE,
VOCEDISPESA,
FATTURA,
IMPORTOFATTURA
)
as (select
FILIALE,
VOCEDISPESA,
FATTURA,
SUM(DISTINCT IMPORTOFATTURA)
from tbl
GROUP BY
FILIALE,
VOCEDISPESA,
FATTURA)


SELECT SUM(A.IMPORTOFATTURA),A.FILIALE,A.VOCEDISPESA
FROM
tbl_CTE A
GROUP BY
A.FILIALE,A.VOCEDISPESA

Spero di averti aiutato (prendi in considerazione il suggerimento che ti ho dato sulla creazione di una tabella FATTURE)

Ciao.

goro83 Profilo | Newbie

grazie :)
ho una domanda.. ho provato a utilizzare parte del tuo codice per il mio scopo (effettivamente forse ho sbagliato sezione, credo che tu abbia fatto riferimento a MySql Server, io in realtà ho bisogno di lavorare in SQL puro all'interno di QlikView), ma ho una domanda da porti:

SUM(DISTINCT ImportoFattura)

..non mi fa una somma di tutti gli importi univoci di fattura?
Io avrei bisogno di una somma di tutti gli importi il cui numero di fattura sia univoco..
Ok che sotto poi utilizzi GROUP BY Fattura, ma il risultato che io ottengo è quello di sommare tutte le fatture con importo univoco. Se per disgrazia ci sono due fatture con lo stesso importo, anche se con numero fattura diverso, vengono sommate una volta sola.

Grazie mille

boccia75 Profilo | Junior Member

Ciao!
Tu dici:
" credo che tu abbia fatto riferimento a MySql Server, io in realtà ho bisogno di lavorare in SQL puro all'interno di QlikView"

no no, questo è sql per sql server....niente mysql.
Dovrebbe funzionare anche in qlik view, ma a questo punto ti chiedo...perchè queste cose non le fai fare a qlik view?

Poi aggiungi:
"SUM(DISTINCT ImportoFattura)
..non mi fa una somma di tutti gli importi univoci di fattura?
Io avrei bisogno di una somma di tutti gli importi il cui numero di fattura sia univoco..
Ok che sotto poi utilizzi GROUP BY Fattura, ma il risultato che io ottengo è quello di sommare tutte le fatture con importo univoco. Se per disgrazia ci sono due fatture con lo stesso importo, anche se con numero fattura diverso, vengono sommate una volta sola."

Ma hai provato la query su management studio? mi sa di no.... comunque questo è il motivo per il quale prima utilizzo la cte( e volendo essere precisi, nella tabella di partenza ci sono EFFETTIVAMENTE e VOLUTAMENTE due fatture [la 100 e la 120 per roma, riferite alle pere con importo 5000]):

select
FILIALE,
VOCEDISPESA,
FATTURA,
SUM(DISTINCT IMPORTOFATTURA)

queste ti estrae i valori univoci per FILIALE,VOCEDISPESA,FATTURA

e tramite questa utilizzo la query successiva.

Visto che mi hai detto che utilizzi qlikview, ecco una soluzione alternativa (ti metto il codice dello script da incollare nel file di qlik):

a:
sql select

FILIALE,
VOCEDISPESA,
FATTURA,
SUM(DISTINCT IMPORTOFATTURA) as IMPORTOFATTURA
from tbl
GROUP BY
FILIALE,
VOCEDISPESA,
FATTURA;



b:
load
FILIALE,
VOCEDISPESA,
SUM(IMPORTOFATTURA) AS IMPORTOFATTURA
RESIDENT a
GROUP BY FILIALE,VOCEDISPESA
;

DROP TABLE a;

Questa è la tabella di partenza:

427x168 20Kb

Questa riporta ESATTAMENTE il risultato che vuoi ottenere:

379x95 9Kb

Che versione di qlikview utilizzi?

Ciao!

hor_c Profilo | Newbie

Ciao, ti lacio il codice prova a fare un copi - paste e prova.
DECLARE @myTable table (FILIALE nvarchar(max), VOCEDISPESA nvarchar(max), ORDINE int, FATTURA int, IMPORTOFATTURA money) insert into @myTable(FILIALE,VOCEDISPESA,ORDINE,FATTURA,IMPORTOFATTURA) values ('Roma','Pere',1,100,5000), ('Roma','Pere',2,100,5000), ('Roma','Mele',3,100,5000), ('Milano','Mele',1,138,5000), ('Milano','Mele',2,138,5000), ('Milano','Pere',2,200,1000), ('Firenze','Pere',4,120,5000), ('Firenze','Pere',5,120,5000) select distinct FILIALE, VOCEDISPESA, FATTURA, IMPORTO from ( select FILIALE ,VOCEDISPESA ,FATTURA ,IMPORTOFATTURA AS IMPORTO ,ROW_NUMBER() OVER(PARTITION BY FATTURA ORDER BY FILIALE) AS rowNumber from @myTable ) as risultato

Risultato


304x100 5Kb


Ciao !!

goro83 Profilo | Newbie

Grazie Boccia, era proprio il risultato che volevo ottenere.

Ho qualche piccola base di MySQL, dovuto anche a qualche pastrocchio fatto su Access, ma sul codice di QlikView sono proprio zero.
Avendo avuto la necessità di creare un report utilizzando il programma dalla Q verde.. ho tentato di arrangiarmi con quello che sapevo fare!

A proposito.. qualcuno (in privato magari se non si può in pubblico) mi può consigliare una pratica guida su Qlik View che parta da zero?
Soprattutto sulla parte relativa allo scripting..

boccia75 Profilo | Junior Member

Ciao Goro,
guide non ne ho mai viste(a parte le prime per la versione 7.0, ma da lì in avanti poco di piu'), qlikview suggerisce di utilizzare la community.
Sulla community potrai trovare anche file .qvw dai quali attingere esempi di script.
Ciao!

boccia75 Profilo | Junior Member

Se ho risolto il tuo problema, setta il post come risolto, thanks.
Ciao!!

goro83 Profilo | Newbie

mmm come faccio?
si può editare il titolo?

boccia75 Profilo | Junior Member

Non so....forse nel primo post che hai fatto.
Cmq non ti impazzire,
CIAO!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5