|
Nu ma descurc cu o interogare....
-
09-27-2008, 5:49 PM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Nu ma descurc cu o interogare....
Salut, ma 'lupt' cu o interogare si nu reusesc sa-i dau de cap...daca ma poate ajuta cineva cu o idee ar fi excelent! Deci...am un tabel NOTE si unul PARTENERI. Pornind de la tabelele de mai jos, as dori sa obtin un rezultat de forma:
CREATE TABLE [dbo].[NOTE]( [ID] [int] IDENTITY(1,1) NOT NULL, [DATADOC] [datetime] NULL, [TIPDOC] [nvarchar](50) NULL, [NRDOC] [nvarchar](50) NULL, [EXP] [nvarchar](50) NULL, [CONTDB] [nvarchar](50) NULL, [CONTCR] [nvarchar](50) NULL, [LEI] [money] NULL) ON [PRIMARY]
CREATE TABLE [dbo].[PARTENERI]( [ID] [int] IDENTITY(1,1) NOT NULL, [NUME] [nvarchar](250) NULL, [CF] [nvarchar](50) NULL, CONSTRAINT [PK__PARTENERI__08EA5793] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [UQ__PARTENERI__09DE7BCC] UNIQUE NONCLUSTERED ( [NUME] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
CREATE TABLE [dbo].[SCHEME_RG]( [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL, [OPERATIE] [decimal](18, 0) NULL, [COL] [decimal](18, 0) NULL, [CONTDB] [nvarchar](50) NULL, [CONTCR] [nvarchar](50) NULL ) ON [PRIMARY]
INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','1111','MARFA','371.1','378.1',111.01) INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','1111','MARFA','371.1','401.MAMAMIA',657.9) INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','1111','MARFA','371.1','4428',146.09)
INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','2222','MARFA','371.1','378.1',17.24) INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','2222','MARFA','371.1','401.COCACOLA',92) INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','2222','MARFA','371.1','4428',20.76) INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','3333','VANZARE','4111.PEPSICOLA','707',119.5) INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','3333','VANZARE','4111.PEPSICOLA','4427',22.7)
INSERT INTO [PARTENERI] ([NUME],[CF]) VALUES ('MAMAMIA','1234') INSERT INTO [PARTENERI] ([NUME],[CF]) VALUES ('COCACOLA','4522') INSERT INTO [PARTENERI] ([NUME],[CF]) VALUES ('PEPSICOLA','413111')
INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (0,1,'371.%','401.%') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (0,1,'371.%','4428') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (0,1,'371.%','378.%') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (1,1,'4111.%','707') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (1,1,'4111.%','4427') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (0,2,'381.%','401.%') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (1,2,'381.%','401.%')
REZULTAT ------------------------------------------------------------- DATADOC, NRDOC, NUME_PARTENER, OPERATIE, COL1, COL2 ------------------------------------------------------------- 01/09/2008, 1111, MAMAMIA, 0, 915.00, 0.00 01/09/2008, 2222, COCACOLA, 0, 130,00, 0.00 01/09/2008, 3333, PEPSICOLA, 1, 142.2, 0.00
Ce am incercat eu nu e bine...imi baga de mai multe ori (3 ori) liniile care apartin unei facturi din cauza ca nu stiu cum sa fac o conexiune intre tabela PARTENERI.NUME si contul analitic al 401.XXXX (care apare din pacate doar la unu din cele 3 rinduri corespunzatoare unui document). Pls help ca nu mai stiu ce sa fac! Daca credeti ca e important, o sa postez interogarea asa cum am gindit-o eu (daca nu ar trebui sa afisez coloana PARTENER ar fi functionala).
Multumesc anticipat!
Revin cu codul:
SELECT DATADOC AS 'Data', NRDOC AS 'Numar', SUM(CASE WHEN OPERATIE = 0 AND COL = 1 THEN VALOARE ELSE 0 END) AS 'A', SUM(CASE WHEN OPERATIE = 1 AND COL = 1 THEN VALOARE ELSE 0 END) AS 'B', SUM(CASE WHEN OPERATIE = 0 AND COL = 2 THEN VALOARE ELSE 0 END) AS 'C', SUM(CASE WHEN OPERATIE = 1 AND COL = 2 THEN VALOARE ELSE 0 END) AS 'D' FROM (SELECT N.DATADOC, N.NRDOC, S.OPERATIE, S.COL, SUM(N.LEI) AS VALOARE FROM dbo.NOTE AS N INNER JOIN dbo.SCHEME_RG AS S ON N.CONTDB LIKE S.CONTDB AND N.CONTCR LIKE S.CONTCR WHERE (N.DATADOC BETWEEN '20080901' AND '20080901') GROUP BY N.DATADOC, N.NRDOC, S.OPERATIE, S.COL) AS X GROUP BY DATADOC, NRDOC, OPERATIE, COL ORDER BY 'Data', 'Numar','A' desc
|
|
-
09-27-2008, 7:17 PM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Nu ma descurc cu o interogare....
[1] Incearca sa indici clar care este problema pe care o ai ! Eu, cel putin, am uitat contabilitatea din anii I si II ...  [2] In tabela parteneri campul 'Nume' (care are definit si un index unic) poate admite si o valoare NULL. Modifica definitia campului Nume a.i. sa fie NOT NULL. O "soluţie" problematică (dar asta şi pentru că designul bazei tale de date este ... mă înţelegi): CREATE FUNCTION ExtragerePartener(@cont NVARCHAR(50)) RETURNS NVARCHAR(50) AS BEGIN DECLARE @analitic NVARCHAR(50) SET @analitic = SUBSTRING( CASE WHEN CHARINDEX('.',@cont)!=0 THEN @cont ELSE NULL END ,CHARINDEX('.',@cont)+1 ,256) RETURN (SELECT ID FROM Parteneri WHERE NUME = @analitic) END; GO
SELECT N.DATADOC, N.NRDOC, S.OPERATIE, S.COL, SUM(N.LEI) AS VALOARE, COALESCE( MAX( dbo.ExtragerePartener(N.CONTDB) ), MAX( dbo.ExtragerePartener(N.CONTCR) ) ) AS IDTertzFurznizorSauClient FROM dbo.NOTE AS N INNER JOIN dbo.SCHEME_RG AS S ON N.CONTDB LIKE S.CONTDB AND N.CONTCR LIKE S.CONTCR WHERE (N.DATADOC BETWEEN '20080901' AND '20080901') GROUP BY N.DATADOC, N.NRDOC, S.OPERATIE, S.COL
|
|
-
09-27-2008, 11:55 PM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Nu ma descurc cu o interogare....
Functia este OK (atita doar ca am sa o modific sa returneze numele firmei si nu ID-ul ei). Chestia cu NOT NULL s-a retinut! Adevarul e ca m-am cam pierdut in explicatii! Am omis sa precizez ceva: cele doua cimpuri COL1 si COL2 pe care as vrea sa le obtin sint coloanele unui raport de gestiune si sint 2 la numar pt ca pe prima trebuie sa fie marfa si pe a doua ambalajele. Coloana OPERATIE se refera la vanzare sau cumparare. Pentru exemplificare, mai trebuie inserata linia :
INSERT INTO [NOTE] ([DATADOC],[TIPDOC],[NRDOC],[EXP],[CONTDB],[CONTCR],[LEI]) VALUES ('20080901','FAC','2222','MARFA','381.1','401.COCACOLA',10.7)
si atunci rezultatul pe care as vrea sa-l obtin ar fi: (vezi cu rosu!)
------------------------------------------------------------------------ DATADOC, NRDOC, NUME_PARTENER, OPERATIE, COL1, COL2 ------------------------------------------------------------------------ 01/09/2008, 1111, MAMAMIA, 0, 915.00, 0.00 01/09/2008, 2222, COCACOLA, 0, 130,00, 10.7 01/09/2008, 3333, PEPSICOLA, 1, 142.2, 0.00
Multumesc pt rabdare!
|
|
-
09-28-2008, 12:53 AM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Nu ma descurc cu o interogare....
Dacă ştergi una din înregistrările (pt. ca formula contabila/sabloanele 381=401 este duplicata/sunt duplicate) INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (0,2,'381.%','401.%') INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (1,2,'381.%','401.%') --de exemplu
atunci comanda urmatoare iti permite sa obtii ce doresti: SELECT N.DATADOC, N.NRDOC, SUM( CASE WHEN S.COL = 1 THEN N.LEI ELSE 0 END ) AS Col1, SUM( CASE WHEN S.COL = 2 THEN N.LEI ELSE 0 END ) AS Col2 FROM dbo.NOTE AS N INNER JOIN dbo.SCHEME_RG AS S ON N.CONTDB LIKE S.CONTDB AND N.CONTCR LIKE S.CONTCR GROUP BY N.TIPDOC, N.NRDOC, N.DATADOC ORDER BY N.NRDOC
2008-09-01 00:00:00.000 1111 915.00 0.00 2008-09-01 00:00:00.000 2222 130.00 10.70 2008-09-01 00:00:00.000 3333 142.20 0.00
|
|
-
09-28-2008, 12:00 PM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Nu ma descurc cu o interogare....
daca nu ar fi o problema...ar fi totul ok! Din cite am inteles (neavand studii economice) pe coloana Ambalaje se trec operatiile care au 381.1=401.1 atat cind e vorba de achizitie (valoarea este pozitiva) cat si cand este vorba de vanzare (valoarea este negativa). Acesta era rationamentul meu cind am adaugat acele linii in tabela SCHEME_RG:
INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (0,2,'381.%','401.%') (oper achizitie, ambalaje) INSERT INTO [SCHEME_RG] ([OPERATIE],[COL],[CONTDB],[CONTCR]) VALUES (1,2,'381.%','401.%') (oper vanzare, ambalaje)
diferenta intre cele doua consta in valoarea campului OPERATIE care as fi vrut ca pt achizitie sa fie 0 si pt vanzare sa fie 1. Dupa cum ai observat, daca exista ambele se dubleaza linia corespunzatoare facturii care contine atat marfa cit si ambalaje. Cum s-ar putea face sa apara in rezultatul final si coloana OPERATII, iar valorile 381.1=401.1 negative sa fie considerate ca vanzare ambalaje?
Multumesc!
|
|
-
09-28-2008, 12:52 PM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Nu ma descurc cu o interogare....
Bine. Atunci interogarea ar putea fi:
SELECT N.DATADOC, N.NRDOC, S.OPERATIE, SUM( CASE WHEN S.COL = 1 THEN N.LEI ELSE 0 END ) AS Col1, SUM( CASE WHEN S.COL = 2 THEN CASE WHEN S.OPERATIE=0 THEN N.LEI ELSE -N.LEI END ELSE 0 END ) AS Col2 FROM dbo.NOTE AS N INNER JOIN dbo.SCHEME_RG AS S ON N.CONTDB LIKE S.CONTDB AND N.CONTCR LIKE S.CONTCR GROUP BY N.TIPDOC, N.NRDOC, N.DATADOC, S.OPERATIE ORDER BY N.NRDOC
cu setul de înregistrări rezultate: 2008-09-01 00:00:00.000 1111 0 915.00 0.00 2008-09-01 00:00:00.000 2222 0 130.00 10.70 2008-09-01 00:00:00.000 2222 1 0.00 -10.70 2008-09-01 00:00:00.000 3333 1 142.20 0.00
A treia înregistrare este afişată deoarece: [1] pentru afişare valorilor din câmpul S.OPERATIE acesta trebuie inclus în clauza GROUP BY, [2] automat [1] presupune şi faptul că în setul de înregistrări rezultate să fie afişate grupurile 2222 0 10.70 pentru achiziţie şi 2222 1 -10.70 pentru vânzare [3] [2] indică faptul că rezultatul 01/09/2008, 1111, MAMAMIA, 0, 915.00, 0.00 01/09/2008, 2222, COCACOLA, 0, 130,00, 10.7 01/09/2008, 3333, PEPSICOLA, 1, 142.2, 0.00 este imposibil de obţinut (asta dacă nu intervine o condiţie WHERE Col2 > 0 / WHERE SUM( CASE WHEN S.COL = 2 ... > 0 de exemplu) ...
|
|
-
09-28-2008, 2:46 PM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Nu ma descurc cu o interogare....
multumesc mult, am ajuns la o solutie de compromis...am pierdut suficient timp.... am hotarit sa fac linii distincte pentru marfa si ambalaje. Asa este ok. Oricum, sint foarte rare operatiile cu ambalaje, iar dpdv contabil se pare ca e ok.
Cand ajungi prin Oradea te scot la o 'maslina'!
|
|
-
09-28-2008, 2:56 PM |
|
|
|