Welcome to Sign in | Help
in Search

cursor sau query pt. o situatie mai complicata

Last post 08-06-2007, 9:53 AM by Alex. 17 replies.
Page 1 of 2 (18 items)   1 2 Next >
Sort Posts: Previous Next
  •  08-03-2007, 11:11 AM 2366

    cursor sau query pt. o situatie mai complicata

     Daca ma poate ajuta cineva cu un SELCT sau un CURSOR, am urmatoarea situatie:

    nr_inreg          data_inreg          tip
    1/2006         01/05/2007         NULL

    1/2007         05/05/2007         ACTIV

    1/2007         07/05/2007         ACTIV

    2/2007         20/05/2007         ACTIV

    2/2007         03/06/2007         NULL

    2/2007         15/06/2007         ACTIV

    2/2007         21/06/2007         NULL

    3/2007         27/06/2007         NULL

    3/2007         04/07/2007         NULL

    4/2007         17/07/2007         NULL

    5/2007         25/07/2007         NULL

    5/2007         28/07/2007         NULL

    6/2007         05/08/2007         ACTIV

    6/2007         08/08/2007         NULL

    as dori sa pot selecta sau sa afisez doar acele "nr_inreg" unde data_inreg este cea mai mare (adica este ultima data la care s-a mai inregistrat respectivul numar) si in acelasi timp mai mica decat 26/07/2007 pt acelasi numar si pt. care tip is NULL .

    De aexemplu pt aceasta situatie ar trebui sa rezulte urmatorele:

    nr_inreg          data_inreg          tip

    2/2007         21/06/2007         NULL

    3/2007         04/07/2007         NULL

    4/2007         17/07/2007         NULL

    Sper sa se inteleaga ceea ce doresc. Multumesc Anticipat

    Filed under:
  •  08-03-2007, 11:41 AM 2368 in reply to 2366

    Re: cursor sau query pt. o situatie mai complicata

    hyghnet:

     Daca ma poate ajuta cineva cu un Query sau un CURSOR, am urmatoarea situatie:

    nr_inreg          data_inreg          tip
    1/2006         01/05/2007         NULL

    1/2007         05/05/2007         ACTIV

    1/2007         07/05/2007         ACTIV

    2/2007         20/05/2007         ACTIV

    2/2007         03/06/2007         NULL

    2/2007         15/06/2007         ACTIV

    2/2007         21/06/2007         NULL

    3/2007         27/06/2007         NULL

    3/2007         04/07/2007         NULL

    4/2007         17/07/2007         NULL

    5/2007         25/07/2007         NULL

    5/2007         28/07/2007         NULL

    6/2007         05/08/2007         ACTIV

    6/2007         08/08/2007         NULL

    as dori sa pot selecta sau sa afisez doar acele "nr_inreg" unde data_inreg este cea mai mare (adica este ultima data la care s-a mai inregistrat respectivul numar) si in acelasi timp mai mica decat 26/07/2007 pt acelasi numar si pt. care tip is NULL .

    De aexemplu pt aceasta situatie ar trebui sa rezulte urmatorele:

    nr_inreg          data_inreg          tip

    2/2007         21/06/2007         NULL

    3/2007         04/07/2007         NULL

    4/2007         17/07/2007         NULL

    Sper sa se inteleaga ceea ce doresc. Multumesc Anticipat

  •  08-03-2007, 12:02 PM 2369 in reply to 2366

    Re: cursor sau query pt. o situatie mai complicata

    Sper ca am inteles bine...

    Pt. SQL 2005:

    WITH kcte(rec_no, rec_date)
    AS (SELECT rec_no, MAX(rec_date) FROM Records GROUP BY rec_no)
    SELECT r.rec_no, k.rec_date, r.rec_type
        FROM Records r JOIN kcte k ON r.rec_no = k.rec_no
    WHERE
    CONVERT(datetime, k.rec_date, 101) < CONVERT(datetime, '7/26/2007', 101) AND
    r.rec_type IS NULL AND
    k.rec_date = r.rec_date

    Pentru SQL 2000, in loc de "cte" foloseste o "variabila tabel". 

  •  08-03-2007, 12:04 PM 2370 in reply to 2369

    Re: cursor sau query pt. o situatie mai complicata

    Mai "cu cantec" poate fi aici lucrul cu "datetime" - ramane de discutat daca ce am propus e absolut OK pentru tine in aceasta privinta. De exemplu, te intereseaza numai ziua inregistrarii, sau si ora, etc...
  •  08-03-2007, 12:14 PM 2371 in reply to 2368

    Re: cursor sau query pt. o situatie mai complicata

    salut, asa nu merge?

     SELECT     nr_inreg, MAX(data_inreg) AS data, tip AS tip
    FROM         dbo.Table2
    GROUP BY nr_inreg, tip
    HAVING      (tip IS NULL) AND (MAX(data_inreg) < CONVERT(DATETIME, '2007-07-26 00:00:00', 102))

     alex.

  •  08-03-2007, 12:56 PM 2375 in reply to 2366

    Re: cursor sau query pt. o situatie mai complicata

    Multumesc Alex.

    Problema este ca ceea ce imi propui tu imi arata data maxima la care numarul are tip is NULL, pe mine ma intereseaza sa-mi arate ultima inregisrare pt un numar numai daca acesta are tip is NULL daca nu sa nu-l afiseze . Daca data maxima pt respectivul numar nu este tip is NULL nu vreau sa-l afisez.

    Ex : pt numarul 1/2006 se afiseaza

    1/2006         01/05/2007         NULL

    iar eu as fi dorit pt asta sa nu afiseze nimik.

    --Apropo lucrez in sql 2k

  •  08-03-2007, 1:03 PM 2376 in reply to 2375

    Re: cursor sau query pt. o situatie mai complicata

    ??? mie mi se pare ca e corect...pentru 1/2006, in exemplul tau nu ai decato singura inregistrare si aceea cu tip = NULL...???
  •  08-03-2007, 1:16 PM 2378 in reply to 2370

    Re: cursor sau query pt. o situatie mai complicata

    Alex sper ca nu te superi , incerc sa fiu cat mai explicit ca si mie cand mi s-a cerut am inteles mai greu.

    OK. luand ex pt nr. 1/2006 acesta este de felul:

    nr_inreg          data_inreg          tip
    1/2006         01/05/2007         NULL

    1/2007         05/05/2007         ACTIV

    1/2007         07/05/2007         ACTIV

    Deci eu vreau sa vad doar linia cu data 07/05/2007 (adica cea mai recenta data  de inregistrare) daca aceasta era de tip is null altfel nu vreau sa o vad.Deci nu trebuie sa vad nimic de la numarul 1/2006 pt ca aceasta data cea mai recenta de inregistrare nu are tip is null.

    trecem la urmatorul numar 2/2007

    2/2007         20/05/2007         ACTIV

    2/2007         03/06/2007         NULL

    2/2007         15/06/2007         ACTIV

    2/2007         21/06/2007         NULL

    aici trebuie sa vad doar linia cu data 21/06/2007 deoarece are tip is null, daca la aceasta data aveam tot ACTIV atunci pt nr. 2/2007 trebuia sa nu se afiseze mimic.

    Asta este si problema mea ca vreau sa vad numai acele linii care sunt ca si data de inregistrare ultima pt un numar si numai daca acestea sunt de tip is null.

    Multumesc pentru intelegere.

  •  08-03-2007, 3:05 PM 2380 in reply to 2378

    Re: cursor sau query pt. o situatie mai complicata

    ...bine, si daca pentru un nr. anume ai o singura inregistrare si tipul este NULL, asta nu "se califica"?
  •  08-03-2007, 3:09 PM 2381 in reply to 2375

    Re: cursor sau query pt. o situatie mai complicata

    hyghnet:

    Multumesc Alex.

    Problema este ca ceea ce imi propui tu imi arata data maxima la care numarul are tip is NULL, pe mine ma intereseaza sa-mi arate ultima inregisrare pt un numar numai daca acesta are tip is NULL daca nu sa nu-l afiseze . Daca data maxima pt respectivul numar nu este tip is NULL nu vreau sa-l afisez.

    Ex : pt numarul 1/2006 se afiseaza

    1/2006         01/05/2007         NULL

    iar eu as fi dorit pt asta sa nu afiseze nimik.

    --Apropo lucrez in sql 2k

    nici o problema....doar ca nu prea am inteles :)

    din inregistrarile afisate de tine in acest post.....mie unul mi se pare ca 1/2006 indeplineste conditiile tale pt a fi afisat in SELECT (are si data maxima pt nr_inreg = 1/2006 si are si tip = null)

     

    deci.....tie iti trebuiesc inregistarile grupate dupa "nr_inreg" care sunt de 2 tipuri ca sa zic asa

    1. nr_inreg cu data maxima si tip = null

    2. nr_inreg cu data maxima si tip = activ

    tu vrei sa ti le intoarca doar pe cele care au si data maxima din grupul respectiv dar si tip = null (daca au data maxima dar tip = activ sa nu ti le intoarca).....asa e?

     

    alex.

  •  08-03-2007, 3:39 PM 2383 in reply to 2381

    Re: cursor sau query pt. o situatie mai complicata

    poate?!?!?!

     select X.Nr,X.Data,X.tip from (
      SELECT     nr_inreg Nr, MAX(data_inreg) AS Data, max(tip) AS tip
      FROM         dbo.Table2
      GROUP BY nr_inreg
      HAVING      (MAX(data_inreg) < CONVERT(DATETIME, '2007-07-26 00:00:00', 102))
      ) X
    where X.tip is null

    alex.

    edit: l-am mai testat si nu e bun :(

  •  08-03-2007, 4:10 PM 2384 in reply to 2383

    Re: cursor sau query pt. o situatie mai complicata

    Alex, se pare ca subquery-ul asociaza incorect datele de inregistrare cu tipul...

    Nu inteleg...de exemplu ce "deosebire" exista intre "1/2006" si "4/2007" - amandoua au tipul NULL si doar cate o inregistrare in tabel...de ce "1/2006" ar trebui exclus din setul rezultat?

  •  08-03-2007, 4:21 PM 2386 in reply to 2384

    Re: cursor sau query pt. o situatie mai complicata

    da..intradevar asociaza incorect datele...am vazut....am incercat in ideea ca poate fentez cumva group by sa nu-mi ceara sa bag si tip in el....dar se pare ca nu mere :)

    si pt mine e o enigma de ce 1/2006 nu trebuie sa faca parte din rezultate....dar trec peste si eu consider ca trebuie sa faca parte pana la proba contrarie :)

    imi mai bat capul cu selectul ala....in ideea ca filtrez o data dupa "nr_inreg" si "data_inreg" maxima si apoi totul dupa "tip" = null

    alex.

  •  08-03-2007, 5:24 PM 2388 in reply to 2366

    Re: cursor sau query pt. o situatie mai complicata

    hyghnet,

    Query-ul scris de Diana ar trebui să furnizeze rezultatele corecte. Singura problemă este în datele de test: în primul rând ai scris 1/2006, iar în următoarele două ai scris 1/2007, dar cred că vroiai să scrii aceeaşi valoare. Încearcă, de exemplu, cu următoarele date de test:

    CREATE TABLE Tabela (
        nr_inreg varchar(7) NOT NULL,
        data_inreg smalldatetime NOT NULL,
        tip varchar(10) NULL,
        PRIMARY KEY (nr_inreg, data_inreg)
    )

    INSERT INTO Tabela VALUES ('1/2007','20070501',NULL)
    INSERT INTO Tabela VALUES ('1/2007','20070505','ACTIV')
    INSERT INTO Tabela VALUES ('1/2007','20070507','ACTIV')
    INSERT INTO Tabela VALUES ('2/2007','20070520','ACTIV')
    INSERT INTO Tabela VALUES ('2/2007','20070603',NULL)
    INSERT INTO Tabela VALUES ('2/2007','20070615','ACTIV')
    INSERT INTO Tabela VALUES ('2/2007','20070621',NULL)
    INSERT INTO Tabela VALUES ('3/2007','20070627',NULL)
    INSERT INTO Tabela VALUES ('3/2007','20070704',NULL)
    INSERT INTO Tabela VALUES ('4/2007','20070717',NULL)
    INSERT INTO Tabela VALUES ('5/2007','20070725',NULL)
    INSERT INTO Tabela VALUES ('5/2007','20070728',NULL)
    INSERT INTO Tabela VALUES ('6/2007','20070805','ACTIV')
    INSERT INTO Tabela VALUES ('6/2007','20070808',NULL)

    SELECT a.* FROM Tabela a INNER JOIN (
        SELECT nr_inreg, MAX(data_inreg) as ultima_data
        FROM Tabela GROUP BY nr_inreg
    ) b ON a.nr_inreg=b.nr_inreg and a.data_inreg=b.ultima_data
    WHERE data_inreg<'20070726' AND tip IS NULL

    Răzvan 

  •  08-03-2007, 5:35 PM 2389 in reply to 2386

    Re: cursor sau query pt. o situatie mai complicata

    sau asa....dar tot intortochiat e.....mai sa-mi rup mainile si nu alta :)))

    CREATE TABLE #temp (numar varchar(50), data_inreg datetime)

    insert into #temp (numar, data_inreg)
      SELECT     nr_inreg Nr, MAX(data_inreg) AS Data
      FROM         dbo.Table2
      GROUP BY nr_inreg
      HAVING      (MAX(data_inreg) < CONVERT(DATETIME, '2007-07-26 00:00:00', 102))

    select tbl.* from dbo.Table2 tbl join #temp t on tbl.nr_inreg = t.numar and tbl.data_inreg = t.data_inreg
    where tbl.tip is null

    drop table #temp

Page 1 of 2 (18 items)   1 2 Next >
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems