salve,
simonezzz wrote:
PRELIEVI:
IDMOVIMENTO
DESCRIZIONE
VERSAMENTI:
IDMOVIMENTO
DESCRIZIONE
MOVIMENTI_CC:
IDMOVIMENTO
IDCC
IMPORTO
MOVIMENTI:
IDMOVIMENTO
DATA
Una query che visualizza la roba seguente:
IDMOVIMENTO | DATA | PRELIEVI.DESCRIZIONE | VERSAMENTI.DESCRIZIONE | IMPORTO
Chiaramente la tabella prelievi e versamenti si dividono in maniera mutualmente esclusiva l'idmovimento. Ovvero se il movimento non sta nei prelievi in prelievi.descrizione ci voglio null e viceversa.
la modellazione della base dati e', IMVHO, veramente terrificante... ottieni comunque quanto da te desiderato, similarmente a
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE PRELIEVI (
IDMOVIMENTO int,
DESCRIZIONE varchar(5)
);
CREATE TABLE VERSAMENTI (
IDMOVIMENTO int,
DESCRIZIONE varchar(5)
);
CREATE TABLE MOVIMENTI_CC (
IDMOVIMENTO int,
IDCC int,
IMPORTO decimal (18,4)
);
CREATE TABLE MOVIMENTI (
IDMOVIMENTO int,
DATA datetime
);
GO
INSERT INTO MOVIMENTI VALUES ( 1, '20080101' );
INSERT INTO MOVIMENTI VALUES ( 2, '20080102' );
INSERT INTO MOVIMENTI VALUES ( 3, '20080103' );
INSERT INTO MOVIMENTI VALUES ( 4, '20080104' );
INSERT INTO MOVIMENTI_CC VALUES ( 1, 1, 10 );
INSERT INTO MOVIMENTI_CC VALUES ( 2, 1, 5 );
INSERT INTO MOVIMENTI_CC VALUES ( 3, 1, 10 );
INSERT INTO MOVIMENTI_CC VALUES ( 4, 1, 8 );
INSERT INTO VERSAMENTI VALUES ( 1, 'V.1' );
INSERT INTO VERSAMENTI VALUES ( 3, 'V.2' );
INSERT INTO PRELIEVI VALUES ( 2, 'P.1' );
INSERT INTO PRELIEVI VALUES ( 4, 'P.2' );
GO
SELECT m.IDMOVIMENTO, m.DATA, p.DESCRIZIONE AS [Secrizione Prelievi], v.DESCRIZIONE AS [Secrizione Versamenti], c.IMPORTO
FROM MOVIMENTI m
JOIN MOVIMENTI_CC c ON m.IDMOVIMENTO = c.IDCC
LEFT JOIN PRELIEVI p ON m.IDMOVIMENTO = p.IDMOVIMENTO
LEFT JOIN VERSAMENTI v ON m.IDMOVIMENTO = v.IDMOVIMENTO
GO
DROP TABLE MOVIMENTI, MOVIMENTI_CC, PRELIEVI, VERSAMENTI;
--<-------
IDMOVIMENTO DATA Secrizione Prelievi Secrizione Versamenti IMPORTO
---------
---------------------
-----------------
-------------------
--------
1 2008-01-01 00
0
0.000 NULL V.1 10.0000
1 2008-01-01 00
0
0.000 NULL V.1 5.0000
1 2008-01-01 00
0
0.000 NULL V.1 10.0000
1 2008-01-01 00
0
0.000 NULL V.1 8.0000
preferire, come modellazione, un qualche cosa piu' simile a questo altrettanto triviale disegno,
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE CC (
ID int,
DESCRIZIONE varchar(10)
);
CREATE TABLE TIPOMOVIMENTO (
ID int PRIMARY KEY,
DESCRIZIONE varchar(10),
SEGNO smallint
CONSTRAINT chk_SEGNO
CHECK ((SEGNO = -1) OR (SEGNO = 1))
);
CREATE TABLE MOVIMENTI (
IDMOVIMENTO int,
DATA datetime,
);
CREATE TABLE MOVIMENTI_CC (
IDMOVIMENTO int,
IDCC int,
IMPORTO decimal (18,4),
Tipo int
CONSTRAINT fk_Movimento_cc$has$type
FOREIGN KEY REFERENCES TIPOMOVIMENTO(Id)
);
GO
INSERT INTO CC VALUES ( 1, 'Pippo' );
INSERT INTO CC VALUES ( 2, 'Pluto' );
INSERT INTO TIPOMOVIMENTO VALUES ( 1, 'Vers', 1 );
INSERT INTO TIPOMOVIMENTO VALUES ( 2, 'Prel', -1 );
INSERT INTO TIPOMOVIMENTO VALUES ( 3, 'GiroC+', 1 );
INSERT INTO TIPOMOVIMENTO VALUES ( 4, 'GiroC-', -1 );
INSERT INTO MOVIMENTI VALUES ( 1, '20080101' );
INSERT INTO MOVIMENTI VALUES ( 2, '20080102' );
INSERT INTO MOVIMENTI VALUES ( 3, '20080103' );
INSERT INTO MOVIMENTI VALUES ( 4, '20080104' );
INSERT INTO MOVIMENTI VALUES ( 5, '20080105' );
INSERT INTO MOVIMENTI_CC VALUES ( 1, 1, 10, 1 );
INSERT INTO MOVIMENTI_CC VALUES ( 2, 1, 5, 2);
INSERT INTO MOVIMENTI_CC VALUES ( 3, 1, 10, 1 );
INSERT INTO MOVIMENTI_CC VALUES ( 4, 1, 8, 2 );
INSERT INTO MOVIMENTI_CC VALUES ( 5, 1, 5, 4 );
INSERT INTO MOVIMENTI_CC VALUES ( 5, 2, 5, 3 );
GO
SELECT cc.DESCRIZIONE AS [Correntista],
t.DESCRIZIONE AS [Tipo Movimento],
m.DATA,
mc.IMPORTO * t.SEGNO AS [Importo con segno]
FROM CC cc
JOIN MOVIMENTI_CC mc ON mc.IDCC = cc.ID
JOIN MOVIMENTI m ON m.IDMOVIMENTO = mc.IDMOVIMENTO
JOIN TIPOMOVIMENTO t ON mc.Tipo = t.Id
GO
DROP TABLE MOVIMENTI, MOVIMENTI_CC;
DROP TABLE CC, TIPOMOVIMENTO;
--<--------
Correntista Tipo Movimento DATA Importo con segno ---------
------------
---------------------
----------------
Pippo Vers 2008-01-01 00
0
0.000 10.0000
Pippo Prel 2008-01-02 00
0
0.000 -5.0000
Pippo Vers 2008-01-03 00
0
0.000 10.0000
Pippo Prel 2008-01-04 00
0
0.000 -8.0000
Pippo GiroC- 2008-01-05 00
0
0.000 -5.0000
Pluto GiroC+ 2008-01-05 00
0
0.000 5.0000
dove non hai una tabella separata per versamenti e prelievi, che non mi pare abbia molto senso, ma una tabella separata di lookup direttamente per il tipo di operazione... per quanto riguarda l'importo del movimento, puoi utilizzare sia un segno sempre positivo con recupero del segno ad esempio dalla stessa tabella di lookup del tipo di operazione, che imputare direttamente il segno della stessa..
saluti