Welcome to Sign in | Help
in Search

Ajutor pt o interogare....

Last post 10-23-2007, 12:55 PM by ThePuiu. 9 replies.
Sort Posts: Previous Next
  •  10-22-2007, 11:04 PM 3058

    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 3059 in reply to 3058

    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 3060 in reply to 3059

    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 3061 in reply to 3060

    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 3062 in reply to 3061

    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 3063 in reply to 3062

    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 3064 in reply to 3063

    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 3068 in reply to 3064

    Re: Ajutor pt o interogare....

    ok, rezolvat!

    Multumesc mult!

  •  10-23-2007, 11:11 AM 3069 in reply to 3062

    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 3070 in reply to 3069

    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

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems