Welcome to Sign in | Help

Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

  •  06-02-2011, 11:00 AM

    Re: Grupare dupa date in intervale diferite in functie de timpul dintre ele

    ok, am revenit..

    in primul rand si inainte de orice altceva as vrea sa fac urmatoarea mentiune: din felul cum vrei sa afisezi tu datele banuiesc ca vrei sa le afisezi intr-un raport. (nu am mai facut rapoarte de mult asa ca nu stiu sa iti dau detalii in directia aia)

    eu am procedat in felul urmator:
    1. am redenumit coloanele end_date = ed si start_date=sd (ca sa imi fie mai usor sa editez queryul de mana)
    2. am creat 2 coloane calculate
    sdm =(datepart(year,[sd])*(12)+datepart(month,[sd])) -> start date months
    edm =(datepart(year,[ed])*(12)+datepart(month,[ed])) -> end date months
    (asta ca sa pot calcula diferenta de care ziceai)
    3.
    am facut queryul urmator:

    SELECT     TOP (100) PERCENT interval_1.id, interval_1.sd, interval_1.ed, interval_1.name, MIN(dbo.interval.id) AS groupId
    FROM         dbo.interval INNER JOIN
                          dbo.interval AS interval_1 ON dbo.interval.name = interval_1.name
    WHERE     (dbo.interval.edm + 10 - interval_1.sdm > 0) AND (dbo.interval.edm < interval_1.sdm) OR
                          (interval_1.edm + 10 - dbo.interval.sdm > 0) AND (interval_1.edm < dbo.interval.sdm) OR
                          (dbo.interval.id = interval_1.id)
    GROUP BY interval_1.id, interval_1.sd, interval_1.ed, interval_1.name

    rezultatele arata cam asa:

    id       sd                   ed          name  groupId
    1    2010-05-05    2010-12-12    aaa    1
    2    2011-05-05    2011-12-12    aaa    1
    3    2008-01-01    2009-05-05    aaa    3
    4    2010-05-05    2010-12-12    bbb    4

    daca am intuit bine la inceput si vrei pt un raport atunci groupId ar trebui sa iti permita sa faci afisarea respectiva

    daca nu am intuit corect atunci queryul asta ar trebui sa te ajute sa pornesti in directia in care vrei sa mergi.

    idea din spatele queryului e urmatoarea:
    - s-a facut un join pe nume ca sa pot calcula diferenta
    - am ps ultimul "or" (dbo.interval.id = interval_1.id) ca sa acopar grupurile 3 si 4
    - am facut restul conditiei (  (dbo.interval.edm + 10 - interval_1.sdm > 0) AND (dbo.interval.edm < interval_1.sdm) OR
                          (interval_1.edm + 10 - dbo.interval.sdm > 0) AND (interval_1.edm < dbo.interval.sdm)) ca sa acopar grupul 1
    - am facut gruparea
    - am scris "ecuatia" pt groupId ( MIN(dbo.interval.id) AS groupId)

    spor in continuare si sper sa iti fie de folos.


    PS: am lucrat pe MSSQL 2008
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems