|
Ajutor pt o interogare....
Last post 10-23-2007, 12:55 PM by ThePuiu. 9 replies.
-
10-22-2007, 11:04 PM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Ajutor pt o interogare....
Salut, am nevoie de ajutor in urmatoarea problema: Am interogarea:
SELECT dbo.PARTENERI.NUME, dbo.ANTET_FACTURI.ID AS aidi, dbo.ANTET_FACTURI.NUMECLIENT, dbo.ANTET_FACTURI.NRDOC, dbo.ANTET_FACTURI.DATA, dbo.ANTET_FACTURI.MONEDA,dbo.ANTET_FACTURI.SERIECARD, (SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID)) AS SUMA, COALESCE((SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID)) - (SELECT SUM(VALOARE) FROM dbo.CHITANTECL WHERE (ID_ANTET_FACTURA = dbo.ANTET_FACTURI.ID)), (SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID))) AS REST FROM dbo.ANTET_FACTURI INNER JOIN dbo.PARTENERI ON dbo.ANTET_FACTURI.ID_PARTENER = dbo.PARTENERI.ID WHERE XXXXXXXXXXXXXXXXXXXXXXXXXXXXX ORDER BY dbo.ANTET_FACTURI.NRDOC
Cele 2 tabele sint de forma: CREATE TABLE [dbo].[ANTET_FACTURI]( [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL, [NRDOC] [decimal](18, 0) NULL, [DATA] [smalldatetime] NULL, [ID_PARTENER] [decimal](18, 0) NULL, [NUMECLIENT] [nvarchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [MONEDA] [nvarchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [TVA] [money] NULL, [ID_USER] [decimal](18, 0) NULL, [MOMENT] [datetime] NULL, [MOD_PLATA] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [SERIECARD] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [VALIDA] [nvarchar](1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY]
si:
CREATE TABLE [dbo].[CHITANTECL]( [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL, [NRCHIT] [decimal](18, 0) NULL, [ID_ANTET_FACTURA] [decimal](18, 0) NULL, [DATA] [smalldatetime] NULL, [VALOARE] [money] NULL, [MONEDA] [nvarchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [TIPDOC] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [ID_USER] [decimal](18, 0) NULL, [MOMENT] [datetime] NULL ) ON [PRIMARY]
Ce nu stiu: cum sa scriu clauza WHERE (unde este XXXXXXXXXXXXXXXX) astfel incit SUMA-REST > 0
Multumesc!
|
|
-
10-23-2007, 12:09 AM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Ajutor pt o interogare....
Incearca: WHERE (SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID)) - COALESCE((SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID)) - (SELECT SUM(VALOARE) FROM dbo.CHITANTECL WHERE (ID_ANTET_FACTURA = dbo.ANTET_FACTURI.ID)), (SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID))) > 0
Sau CREATE VIEW Fact AS SELECT dbo.PARTENERI.NUME, dbo.ANTET_FACTURI.ID AS aidi, dbo.ANTET_FACTURI.NUMECLIENT, dbo.ANTET_FACTURI.NRDOC, dbo.ANTET_FACTURI.DATA, dbo.ANTET_FACTURI.MONEDA, dbo.ANTET_FACTURI.SERIECARD,
(SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID)) AS SUMA,
COALESCE((SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID)) - (SELECT SUM(VALOARE) FROM dbo.CHITANTECL WHERE (ID_ANTET_FACTURA = dbo.ANTET_FACTURI.ID)), (SELECT SUM(PRET_UNITAR) FROM dbo.DETAIL_FACTURI WHERE (ID_FACTURA = dbo.ANTET_FACTURI.ID))) AS REST
FROM dbo.ANTET_FACTURI INNER JOIN dbo.PARTENERI ON dbo.ANTET_FACTURI.ID_PARTENER = dbo.PARTENERI.ID
si SELECT * FROM Fact WHERE Suma - Rest > 0
|
|
-
10-23-2007, 12:46 AM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Ajutor pt o interogare....
am incercat prima varianta (eu am gindit-o initial mai simplist - adica fara coalesce) si nu returneaza nici un rezultat, desi, conform valorilor din tabel ar trebui... Varianta 2 functioneaza, dar as prefera-o pe prima. Ce nu este oare bine? Pt >0 sau =0 nu returneaza nici un rezultat, iar pt <0 apar toate valorile din tabela....
|
|
-
10-23-2007, 1:05 AM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Ajutor pt o interogare....
Nu ar trebui sa faci sumă de cantitate * preţ unitar ... SELECT SUM(CANTITATE * PRET_UNITAR) pentru a obţine suma totală ? O sumă de preţuri unitare mi se pare puţin fără sens.
|
|
-
10-23-2007, 1:32 AM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Ajutor pt o interogare....
evident! dar acesta este doar o bucata de cod de test. Oricum, am vazut acum ca nu am pus si structura de la dbo.DETAIL_FACTURI ! Dar despre problema cu rezultatul ciudat, ce zici?
CREATE TABLE [dbo].[DETAIL_FACTURI]( [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL, [ID_FACTURA] [decimal](18, 0) NULL, [ID_COMANDA] [decimal](18, 0) NULL, [PRET_UNITAR] [money] NULL, [PRET_SAFE] [money] NULL, [BUC] [decimal](18, 0) NULL, [CAMERE] [decimal](18, 0) NULL, [VAL_TVA] [money] NULL, [TVA] [decimal](18, 0) NULL, [REGISTRU] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ) ON [PRIMARY]
Fara clauza WHERE rezultatul interogarii este:
MINI MARCO 10005 2007-10-23 EUR 90.00 0.00 MINI MARCO 10000 2007-10-08 EUR 749.30 0.00 MINI MARCO 10001 2007-10-08 EUR 110.00 0.00 MOLNAR IOAN 10003 2007-10-23 EUR 15.76 4.76 iar daca pun conditia asa cum ai spus si tu (>0) rezultatul este nul !
|
|
-
10-23-2007, 10:09 AM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Ajutor pt o interogare....
SUMA-REST > 0
Ce doresti de fapt sa afisezi ?
[1] facturile care nu au fost achitate integral ( REST_DE_PLATA > 0 ) [2] facturile la care s-au efectuat plati ( SUMA_DE_PLATA - SUMA_PLATITA = REST_DE_PLATA => SUMA_DE_PLATA - REST_DE_PLATA = SUMA_PLATITA ) SUMA-REST > 0 <=> SUMA_PLATITA > 0
|
|
-
10-23-2007, 10:20 AM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
Re: Ajutor pt o interogare....
Incearca SELECT dbo.PARTENERI.NUME,
dbo.ANTET_FACTURI.ID AS aidi,
dbo.ANTET_FACTURI.NUMECLIENT,
dbo.ANTET_FACTURI.NRDOC,
dbo.ANTET_FACTURI.DATA,
dbo.ANTET_FACTURI.MONEDA,
dbo.ANTET_FACTURI.SERIECARD,
Q1.S AS SUMA_DE_PLATA,
Q2.S AS SUMA_PLATITA,
Q1.S - ISNULL(Q2.S,0) AS REST
FROM dbo.ANTET_FACTURI
INNER JOIN dbo.PARTENERI ON dbo.ANTET_FACTURI.ID_PARTENER = dbo.PARTENERI.ID
INNER JOIN (
SELECT ID_FACTURA, SUM(PRET_UNITAR) AS S
FROM dbo.DETAIL_FACTURI
GROUP BY ID_FACTURA
) AS Q1 ON dbo.ANTET_FACTURI.ID = Q1.ID_FACTURA
LEFT OUTER JOIN (
SELECT ID_ANTET_FACTURA, SUM(VALOARE) AS S
FROM dbo.CHITANTECL
GROUP BY ID_ANTET_FACTURA
) AS Q2 ON dbo.ANTET_FACTURI.ID = Q2.ID_ANTET_FACTURA
WHERE Q1.S - ( Q1.S - ISNULL(Q2.S,0) ) > 0 --adica ISNULL(Q2.S,0) > 0
|
|
-
10-23-2007, 11:06 AM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Ajutor pt o interogare....
ok, rezolvat!
Multumesc mult!
|
|
-
10-23-2007, 11:11 AM |
-
rsocol
-
-
-
Joined on 10-03-2006
-
Bucuresti
-
sysadmin
-
-
|
Re: Ajutor pt o interogare....
Nu ai prezentat nici structura tabelei PARTENERI, aşa că am presupus: CREATE TABLE PARTENERI (
ID decimal(18,0) IDENTITY PRIMARY KEY,
NUME nvarchar(50) NOT NULL UNIQUE
)
Ar fi fost utile şi nişte date de test (precum şi rezultatul dorit pentru acele date). Pentru a fi mai uşor de citit, aş scrie query-ul iniţial astfel: SELECT p.NUME, a.ID AS aidi, a.NUMECLIENT, a.NRDOC, a.DATA, a.MONEDA,a.SERIECARD, (
SELECT SUM(d.PRET_UNITAR) FROM dbo.DETAIL_FACTURI d WHERE
d.ID_FACTURA =
a.ID
) AS SUMA,
COALESCE((
SELECT SUM(d.PRET_UNITAR) FROM dbo.DETAIL_FACTURI d WHERE
d.ID_FACTURA =
a.ID
) - (
SELECT SUM(c.VALOARE) FROM dbo.CHITANTECL c WHERE c.ID_ANTET_FACTURA = a.ID
), (
SELECT SUM(d.PRET_UNITAR) FROM dbo.DETAIL_FACTURI d WHERE
d.ID_FACTURA =
a.ID
)) AS REST
FROM dbo.ANTET_FACTURI
a INNER JOIN
dbo.PARTENERI p ON
a.ID_PARTENER =
p.ID
ORDER BY a.NRDOC
Însă putem scrie acelaşi query ceva mai simplu, astfel: SELECT p.NUME, a.ID AS aidi, a.NUMECLIENT, a.NRDOC, a.DATA, a.MONEDA,a.SERIECARD, (
SELECT SUM(d.PRET_UNITAR) FROM dbo.DETAIL_FACTURI d WHERE
d.ID_FACTURA =
a.ID
) AS SUMA,
(
SELECT SUM(d.PRET_UNITAR) FROM dbo.DETAIL_FACTURI d WHERE
d.ID_FACTURA =
a.ID
) - COALESCE((
SELECT SUM(c.VALOARE) FROM dbo.CHITANTECL c WHERE c.ID_ANTET_FACTURA = a.ID
),
0) AS REST
FROM dbo.ANTET_FACTURI
a INNER JOIN
dbo.PARTENERI p ON
a.ID_PARTENER =
p.ID
ORDER BY a.NRDOC
În privinţa condiţiei respective, la fel ca şi Bogdan, mă întreb: ce vrei să afişezi? (a) facturile care au restul de plată mai mare ca zero ? sau (b) facturile care au suma-rest > 0 ? Dacă vrei (b), asta înseamnă suma>rest, adică suma>suma-plăţi, adică suma+plăţi>suma, adică plăţi>0.
Dar cred că vrei (a), aşa că aş scrie:
SELECT *, SUMA-PLATI AS REST FROM (
SELECT
p.NUME, a.ID AS aidi, a.NUMECLIENT, a.NRDOC, a.DATA, a.MONEDA,a.SERIECARD, (
SELECT SUM(d.PRET_UNITAR) FROM dbo.DETAIL_FACTURI d WHERE
d.ID_FACTURA =
a.ID
) AS SUMA, COALESCE((
SELECT SUM(c.VALOARE) FROM dbo.CHITANTECL c WHERE c.ID_ANTET_FACTURA = a.ID
),
0) AS PLATI
FROM
dbo.ANTET_FACTURI a INNER
JOIN dbo.PARTENERI
p ON a.ID_PARTENER
= p.ID
) X WHERE SUMA-PLATI>0
ORDER BY NRDOC
Răzvan
|
|
-
10-23-2007, 12:55 PM |
-
ThePuiu
-
-
-
Joined on 02-14-2007
-
Oradea
-
db_owner
-
-
|
Re: Ajutor pt o interogare....
asta vroiam: (a) facturile care au restul de plată mai mare ca zero. Problema era mai simpla decit am crezut, dar eram eu adormit! Asa cum ai precizat si tu Razvane, totul se reducea la o comparatie intre rest si 0!
Multumesc pt timpul acordat! Puiu
|
|
|
|
|