17 messaggi dal 22 agosto 2007
Ciao a tutti/e. Non riesco a trovare una soluzione al seguente problema. Tra le varie colonne di una tabella, ho 3 campi che indicano 3 diversi costi, chiamiamoli CA, CB e CC. In altri tre campi ho le relative aliquote iva: IA, IB, IC. Quello che mi serve è trovare una query che mi raggruppi i dati in modo da avere la somma dei costi suddivisa per aliquota iva. Ovviamente le aliquote IA, IB e IC possono essere diverse tra loro anche all' interno della stessa riga. A me serverebbe un risultato del genere:

somma dei costi (CA+CB+CC) che hanno aliquota = 20
somma dei costi (CA+CB+CC) che hanno aliquota = 4
somma dei costi (CA+CB+CC) che hanno aliquota = 19
somma dei costi (CA+CB+CC) che hanno aliquota = 7
etc...

Qualcuno ha qualche idea!? A me proprio non viene in mente...

Grazie, Marco
salve Marco,
kingmob wrote:
Ciao a tutti/e. Non riesco a trovare una soluzione al seguente problema. Tra le varie colonne di una tabella, ho 3 campi che indicano 3 diversi costi, chiamiamoli CA, CB e CC. In altri tre campi ho le relative aliquote iva: IA, IB, IC. Quello che mi serve è trovare una query che mi raggruppi i dati in modo da avere la somma dei costi suddivisa per aliquota iva. Ovviamente le aliquote IA, IB e IC possono essere diverse tra loro anche all' interno della stessa riga. A me serverebbe un risultato del genere:

somma dei costi (CA+CB+CC) che hanno aliquota = 20
somma dei costi (CA+CB+CC) che hanno aliquota = 4
somma dei costi (CA+CB+CC) che hanno aliquota = 19
somma dei costi (CA+CB+CC) che hanno aliquota = 7
etc...

Qualcuno ha qualche idea!? A me proprio non viene in mente...
aiuta molto aggiungere alla richiesta anche il codice DDL ed alcuni comandi INSERT INTO che riproducano lo scenario semplificato da utilizzare.. aiuta molto anche sapere che DBMS tu stia utilizzando..
ad ogni modo, se ho compreso l'esigenza, di seguito un esempio basato su SQL Server che utilizza l'espressione CASE (disponibile in molti altri engine) per la valorizzazione dell'aggregazione, ritornando quindi una rotazione su colonna delle aliquote ricercate.. non ci sono tutte le permutazioni con tutte le aliquote ma ritengo risulti comunque semplice la completazione delle permutazioni, se necessaria..

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
Id int NOT NULL IDENTITY PRIMARY KEY,
ca decimal(18,4) NOT NULL DEFAULT 0,
cb decimal(18,4) NOT NULL DEFAULT 0,
cc decimal(18,4) NOT NULL DEFAULT 0,
ia decimal(6,2) NOT NULL DEFAULT 0,
ib decimal(6,2) NOT NULL DEFAULT 0,
ic decimal(6,2) NOT NULL DEFAULT 0
);
GO
INSERT INTO dbo.t VALUES ( 20, 0, 0, 20, 0, 0 );
INSERT INTO dbo.t VALUES ( 0, 20, 0, 0, 20, 0 );
INSERT INTO dbo.t VALUES ( 0, 0, 20, 0, 0, 20 );
INSERT INTO dbo.t VALUES ( 4, 0, 0, 4, 0, 0 );
INSERT INTO dbo.t VALUES ( 0, 4, 0, 0, 4, 0 );
INSERT INTO dbo.t VALUES ( 0, 0, 4, 0, 0, 4 );
INSERT INTO dbo.t VALUES ( 10, 0, 0, 10, 0, 0 );
INSERT INTO dbo.t VALUES ( 0, 10, 0, 0, 10, 0 );
INSERT INTO dbo.t VALUES ( 0, 0, 10, 0, 0, 10 );
INSERT INTO dbo.t VALUES ( 20, 4, 10, 20, 4, 10 );
INSERT INTO dbo.t VALUES ( 4, 10, 20, 4, 10, 20 );
INSERT INTO dbo.t VALUES ( 10, 20, 4, 10, 20, 4 );
GO
SELECT
SUM(
CASE WHEN ia = 4 THEN ca ELSE 0 END
+ CASE WHEN ib = 4 THEN cb ELSE 0 END
+ CASE WHEN ic = 4 THEN cc ELSE 0 END
) AS [Somma 4%],
SUM(
CASE WHEN ia = 10 THEN ca ELSE 0 END
+ CASE WHEN ib = 10 THEN cb ELSE 0 END
+ CASE WHEN ic = 10 THEN cc ELSE 0 END
) AS [Somma 10%],
SUM(
CASE WHEN ia = 19 THEN ca ELSE 0 END
+ CASE WHEN ib = 19 THEN cb ELSE 0 END
+ CASE WHEN ic = 19 THEN cc ELSE 0 END
) AS [Somma 19%],
SUM(
CASE WHEN ia = 20 THEN ca ELSE 0 END
+ CASE WHEN ib = 20 THEN cb ELSE 0 END
+ CASE WHEN ic = 20 THEN cc ELSE 0 END
) AS [Somma 20%]
FROM dbo.t;
GO
DROP TABLE dbo.t;
--<------
Somma 4% Somma 10% Somma 19% Somma 20%
-------
---------
--------
----------
24.0000 60.0000 0.0000 120.0000

saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
http://www.hotelsole.com - http://www.hotelsolericcione.de
17 messaggi dal 22 agosto 2007
Ciao! Inanzitutto grazie per la risposta. Ad utilizzare il case when non ci avevo proprio pensato. Per quanto riguarda la scarsità di dettagli della mia domanda, hai ragione, ero stato un po' troppo vago. Comunque hai ipotizzato bene e utilizzo SqlServer.
Il problema alla fine penso di averlo però risolto in altro modo. A me è venuto in mente di passare per una tabella di appoggio e utilizzare più di una query:

select sum(ca) as costo, ia as iva into tabtemp from tabiniziale group by ia
insert into tabtemp select sum(cb) as costo, ib as iva from tabiniziale group by ib
insert into tabtemp select sum(cc) as costo, ic as iva from tabiniziale group by ic

insert into tabfinale select sum(costo) as costofinale, iva as ivafinale from tabtemp group by iva

Spero di aver reso il concetto dietro il mio ragionamento. Non entro troppo nello specifico perchè ancora non ho finito di concretizzare il tutto nella mia situazione, ma per ora sembra funzioni.
Sicuramente il tuo metodo è più veloce, però la mia tabella non dovrebbe avere molti dati (al max 3000 righe). Inoltre non conosco in anticipo tutte le possibili aliquote iva.

Grazie, Marco

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC