Problema sun(campo)

lunedì 16 aprile 2007 - 10.42

Pongo Profilo | Senior Member

Ciao ho questa query

select data, movimentirighe.nodo, movimentirighe.causale, prezzolistino
movimentirighe.aliquotaiva, prezzolistino from movimentirighe
inner join movimentitestate on(movimentitestate.numero=movimentirighe.numero
and movimentirighe.nodo=movimentitestate.nodo and movimentirighe.causale like 's02' and movimentirighe.annullato=0)
group by movimentirighe.nodo, movimentirighe.causale,
movimentitestate.Data, aliquotaiva, prezzolistino
order by movimentirighe.nodo, movimentitestate.Data, aliquotaiva;

Volevo chiedervi: perchè se non metto tutti i campi nel group by mi da errore?

I risultato di questa query sono riassumendo
nodo data prezzo aliquota
1 12-1 1 10
1 12-1 3 10
1 12-1 8 20
1 12-1 10 20

io inivece vorrei che i prezzo fossero uniti: cioè nodo 1 data 12-1 prezzo 4 aliquota 10

e l'altro record nodo 1 data 12-1 prezzo 18 aliquota 20.

per fare cioò ho provato a mettere sun(prezzolistino) e a togliere prezzo listino dal group by, però non viene giusta la somma! Viene troppo alta.

Avete qualche idea? Grazie.

amelix Profilo | Expert

Che errore ti da?
E qual'è la query che ti da il risultato che hai postato?

A.
Andrea
http://www.MelisWeb.eu/
http://s2.bitefight.it/c.php?uid=58171

Pongo Profilo | Senior Member

La quey che mi da la prima serie di risultati è la prima() l'ho corretta c'era un sum in più) e ad occhio e croce i dati sono corretti.

Se poi al posto di prezzolistino metto sum(prezzolistino), togliendo prezzolistino dalla clausola Group BY, vorrei ottenere la seconda serie di risultati. Ed effettivamente li ottengo, però sono sbagliati. I valori sono più alti di quello che dovrebbero essere.

Non mi viene lanciato nessun tipo di errore. SQL esegue correttamente. solo i dati non sono quello che mi apsetto.

lbenaglia Profilo | Guru

>Volevo chiedervi: perchè se non metto tutti i campi nel group
>by mi da errore?

Ciao Pongo,

semplice, perché altrimenti il dbengine non saprebbe come raggruppare quelle colonne della select list alle quali non hai applicato alcuna funzione di aggregazione

Se ci posti un esempio completo (CREATE TABLE, INSERT INTO e risultato che vuoi ottenere) potremo darti una mano.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Pongo Profilo | Senior Member

Le tabelle sono qualcosa di osceno vedo di farvi il riassunto. C'è movimentitestate che contiene le intestazioni degli scontrini: data,codicenegozio(nodo), e altri dati diciamo "inutili".

Poi c'è Movemntirighe che contiene le righe desli scontrini: data, negozio, numero scontrino(testata), numero riga, prezzo e aliquota.

I dati presenti In movimenti righe possono essere:
12-1-07.......Negozio1........10 (euro).......IVa(10)
12-1-07.......Negozio1........20 (euro).......Iva(10)
12-1-07.......Negozio1........30 (euro).......IVa(20)
12-1-07.......Negozio1........40 (euro).......Iva(20)
13-1-07.......Negozio1........15 (euro).......IVa(10)
13-1-07.......Negozio1........25 (euro).......Iva(10)
12-1-07.......Negozio1........30 (euro).......IVa(20)
13-1-07.......Negozio1........5 (euro).........Iva(0)

Io vorrei avere dati del tipo:

12-1-07.......Negozio1........30 (euro).......IVa(10)
12-1-07.......Negozio1........70 (euro).......Iva(20)
13-1-07.......Negozio1........40 (euro).......IVa(10)
13-1-07.......Negozio1........30 (euro).......Iva(20)
13-1-07.......Negozio1........5 (euro).........IVa(0)


Se proprio vuoi posso anche postare gli script delle tabelle ma sono veramente "oscene". Le tabelle non presentano nessu "diagramma" cioè nessun vincolo di integrità.

Spero possa bastare. Intanto grazie!

lbenaglia Profilo | Guru

>Io vorrei avere dati del tipo:
>
>12-1-07.......Negozio1........30 (euro).......IVa(10)
>12-1-07.......Negozio1........70 (euro).......Iva(20)
>13-1-07.......Negozio1........40 (euro).......IVa(10)
>13-1-07.......Negozio1........30 (euro).......Iva(20)
>13-1-07.......Negozio1........5 (euro).........IVa(0)

Ecco qua:

USE tempdb; CREATE TABLE dbo.MovimentiTestate( Data smalldatetime NOT NULL, Negozio varchar(10) NOT NULL, Importo tinyint NOT NULL, Iva tinyint NOT NULL, CONSTRAINT PK_MovimentiTestate PRIMARY KEY(Data, Negozio, Importo) ); INSERT dbo.MovimentiTestate VALUES('20070112', 'Negozio1', 10, 10); INSERT dbo.MovimentiTestate VALUES('20070112', 'Negozio1', 20, 10); INSERT dbo.MovimentiTestate VALUES('20070112', 'Negozio1', 30, 20); INSERT dbo.MovimentiTestate VALUES('20070112', 'Negozio1', 40, 20); INSERT dbo.MovimentiTestate VALUES('20070113', 'Negozio1', 15, 10); INSERT dbo.MovimentiTestate VALUES('20070113', 'Negozio1', 25, 10); INSERT dbo.MovimentiTestate VALUES('20070113', 'Negozio1', 30, 20); INSERT dbo.MovimentiTestate VALUES('20070113', 'Negozio1', 5, 0); /* Soluzione per SQL Server 2000 */ SELECT M.Data, M.Negozio, SUM(M.Importo) AS Importo, M.Iva FROM dbo.MovimentiTestate AS M JOIN ( SELECT DISTINCT Data, Negozio, Iva FROM dbo.MovimentiTestate ) AS Q ON M.Data = Q.Data AND M.Negozio = Q.Negozio AND M.Iva = Q.Iva GROUP BY M.Data, M.Negozio, M.Iva; /* Soluzione per SQL Server 2005 che fa uso di una ** Common Table Expression */ WITH CTE_GetKey AS ( SELECT DISTINCT Data, Negozio, Iva FROM dbo.MovimentiTestate ) SELECT M.Data, M.Negozio, SUM(M.Importo) AS Importo, M.Iva FROM dbo.MovimentiTestate AS M JOIN CTE_GetKey AS CTE ON M.Data = CTE.Data AND M.Negozio = CTE.Negozio AND M.Iva = CTE.Iva GROUP BY M.Data, M.Negozio, M.Iva; /* Output: Data Negozio Importo Iva ----------------------- ---------- ----------- ---- 2007-01-12 00:00:00 Negozio1 30 10 2007-01-12 00:00:00 Negozio1 70 20 2007-01-13 00:00:00 Negozio1 5 0 2007-01-13 00:00:00 Negozio1 40 10 2007-01-13 00:00:00 Negozio1 30 20 (5 row(s) affected) */ DROP TABLE dbo.MovimentiTestate;

>Se proprio vuoi posso anche postare gli script delle tabelle
>ma sono veramente "oscene". Le tabelle non presentano nessu "diagramma"
>cioè nessun vincolo di integrità.
Male, molto male...

>Spero possa bastare. Intanto grazie!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Pongo Profilo | Senior Member


>>Se proprio vuoi posso anche postare gli script delle tabelle
>>ma sono veramente "oscene". Le tabelle non presentano nessu "diagramma"
>>cioè nessun vincolo di integrità.
>Male, molto male...
>
>>Spero possa bastare. Intanto grazie!
>Prego.
>
>Ciao!

Adesso provo subito! ^_^

Pensa che la ditta non mi ha fornito un UML perchè ha detto che non ce l'ha e il software in questione COSTA un bel po' di euro!

Pongo Profilo | Senior Member

Grazie Lorenzo, l'ho adattata al mio DB però ancora mi da dei dati sbagliati.

Proverò per altre via. Intato questa la uso per un'altra ricerca.

Ciao e grazie.

lbenaglia Profilo | Guru

>Però non riesco a capire dove fosse sbagliata la mia. Cioè ho
>fatto una inner join e tu una join
Di default se scrivi solo JOIN verrà effettuata una INNER JOIN, pertanto non è questo che differenzia le due query...

>, poi io ho usato tutta la
>seconda tabella, tu l'hai ridotta con una select.
>
>Spresti spiegarmi?
Ecco, la differenza è proprio questa
Come puoi vedere, la tabella derivata (o la CTE) restituisce i valori di Data, Negozio e Iva univoci. A questo punto non ci resta che eseguire una INNER JOIN con la tabella base specificando nella clausola ON le 3 colonne e calcolando la somma dell'importo.

La tua query invece raggruppava anche per l'importo, e quindi in sostanza non ottenevi il risultato richiesto.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5