Welcome to Sign in | Help
in Search

Nu ma descurc cu o interogare....

Last post 09-28-2008, 2:56 PM by B_gd_n[ ]Sahlean. 7 replies.
Sort Posts: Previous Next
  •  09-27-2008, 5:49 PM 5661

    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 5662 in reply to 5661

    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 ... Smile
    [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 5664 in reply to 5662

    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 5665 in reply to 5664

    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 5667 in reply to 5665

    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 5668 in reply to 5667

    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 5669 in reply to 5668

    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 5670 in reply to 5669

    Re: Nu ma descurc cu o interogare....

    Prin septembrie 2009 !SmileBig Smile
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems