[SQL 2005 Express] Doppia select sulla stessa tabella

lunedì 06 luglio 2009 - 19.08

alexmed Profilo | Guru

Ciao a tutti
La tabella ha queste colonne

idConto; Dare; Avere; Check

Il risultato che vorrei ottenere è:

idConto; SUM(Dare); SUM(Avere); SUM(Dare) se Check è True; SUM(Avere) se Check è True

Si può fare?


Ciao

alexmed

lbenaglia Profilo | Guru

>Ciao a tutti
>La tabella ha queste colonne
>
>idConto; Dare; Avere; Check
>
>Il risultato che vorrei ottenere è:
>
>idConto; SUM(Dare); SUM(Avere); SUM(Dare) se Check è True; SUM(Avere)
>se Check è True
>
>Si può fare?
Se idconto è univoco no dato che non avverrebbe alcun raggruppamento.
Che DBMS utilizzi?
Posta un esempio completo con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set finale che vorresti ottenere con quei dati.

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

alexmed Profilo | Guru

Ciao Lorenzo,

Effettivamente avevo omesso la colonna IdOperazione che è la colonna con la chiave primaria (idConto è il riferimento al Conto Corrente in cui avvengono le operazioni)

Tabella:

CREATE TABLE dbo.OPERAZIONI ( idOperazione int NOT NULL IDENTITY (1, 1), idConto int NOT NULL, Data datetime NULL, Nota nvarchar(250) NULL, DARE decimal(18, 2) NULL, AVERE decimal(18, 2) NULL, REM bit NULL ) ON [PRIMARY]

Dati:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Risultato:

idConto; Dare; Avere; Dare REM; Avere REM
1; 7000; 0; 6000; 0
2; 3000; 0; 2000; 0

I dati li ho scritti a manina e solo per la colonna Dare ma il concetto è il medesimo.

In pratica vorrei sommare una prima volta la colonna completa di tutti i valori ed una seconda volta solo se il valore della colonna REM è = True



alexmed

lbenaglia Profilo | Guru

>Ciao Lorenzo,
>
>Effettivamente avevo omesso la colonna IdOperazione che è la
>colonna con la chiave primaria (idConto è il riferimento al Conto
>Corrente in cui avvengono le operazioni)
>
>Tabella:
>
>CREATE TABLE dbo.OPERAZIONI
> (
> idOperazione int NOT NULL IDENTITY (1, 1),
> idConto int NOT NULL,
> Data datetime NULL,
> Nota nvarchar(250) NULL,
> DARE decimal(18, 2) NULL,
> AVERE decimal(18, 2) NULL,
> REM bit NULL
> ) ON [PRIMARY]
>
>Dati:
>
>
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (1, 1, AAA, 03 / 07 / 2009, 1000, 0, True)
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (1, 1, BBB, 04 / 07 / 2009, 1000, 0, False)
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (1, 1, CCC, 05 / 07 / 2009, 2000, 0, True)
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (1, 1, DDD, 06 / 07 / 2009, 3000, 0, False)
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (2, 1, EEE, 06 / 07 / 2009, 1000, 0, True)
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (2, 1, FFF, 06 / 07 / 2009, 1000, 0, True)
>INSERT INTO dbOPERAZIONE (idConto, idTipologia, Nota, Data, DARE,
>AVERE, REM) VALUES (2, 1, GGG, 06 / 07 / 2009, 1000, 0, False)
>
>
>Risultato:
Le INSERT non funzionano dato che:

- la tabella dbOPERAZIONE non esiste;
- la colonna idTipologia non esiste;
- le stringhe non sono racchiuse tra apici;
- le date non sono in formato ANSI SQL ('YYYMMDD');
- il data type bit accetta esclusivamente 0, 1 e NULL (True e False non significano niente).

Riposta un esempio completo E FUNZIONANTE, poi ne riparliamo.

P.S.: non ci hai ancora detto con che DBMS stai lavorando (e versione)...

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

alexmed Profilo | Guru

Ciao
>P.S.: non ci hai ancora detto con che DBMS stai lavorando (e versione)...
L'avevo scritto nel titolo
SQL 2005 Express (quello che danno con Visual Basic 2005 Express)

Vediamo se riesco a stò giro:

INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (1, '20090706', 'AAA', 1000, 0, 1)
INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (1, '20090706', 'BBB', 1000, 0, 0)
INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (1, '20090706', 'CCC', 2000, 0, 1)
INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (1, '20090706', 'DDD', 3000, 0, 0)
INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (2, '20090706', 'EEE', 1000, 0, 1)
INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (2, '20090706', 'FFF', 1000, 0, 1)
INSERT INTO OPERAZIONE (idConto, Data, Nota, DARE, AVERE, REM) VALUES (2, '20090706', 'GGG', 1000, 0, 0)

Ciao
alexmed

lbenaglia Profilo | Guru

>>P.S.: non ci hai ancora detto con che DBMS stai lavorando (e versione)...
>L'avevo scritto nel titolo
Giusto, svista mia

>Vediamo se riesco a stò giro:
Con i dati forniti cambia il risultato della prima riga rispetto a quanto postato in precedenza:

USE tempdb; CREATE TABLE dbo.Operazioni( idOperazione int NOT NULL IDENTITY PRIMARY KEY, idConto int NOT NULL, Data date NOT NULL, Nota char(3) NOT NULL, DARE int NOT NULL, AVERE int NOT NULL, REM bit NOT NULL ); INSERT dbo.Operazioni VALUES (1, '20090706', 'AAA', 1000, 0, 1) , (1, '20090706', 'BBB', 1000, 0, 0) , (1, '20090706', 'CCC', 2000, 0, 1) , (1, '20090706', 'DDD', 3000, 0, 0) , (2, '20090706', 'EEE', 1000, 0, 1) , (2, '20090706', 'FFF', 1000, 0, 1) , (2, '20090706', 'GGG', 1000, 0, 0); SELECT idConto , SUM(DARE) AS Dare , SUM(AVERE) AS Avere , SUM(CASE REM WHEN 1 THEN DARE ELSE 0 END ) AS [Dare REM] , SUM(CASE REM WHEN 1 THEN AVERE ELSE 0 END ) AS [Avere REM] FROM dbo.Operazioni GROUP BY idConto; /* Output: idConto Dare Avere Dare REM Avere REM ----------- ----------- ----------- ----------- ----------- 1 7000 0 3000 0 2 3000 0 2000 0 (2 row(s) affected) */ DROP TABLE dbo.Operazioni;

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

alexmed Profilo | Guru

Grazie Lorenzo
>Con i dati postati cambia il risultato della prima riga rispetto a quanto postato in precedenza:
Perfetto!!!

>Ciao!
Ciao e nuovamente grazie.



alexmed
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5