confused on syntax - combining two queries

  • I have two queries that I'm trying to combine, but can't figure out how to combine them ... successfully!?! The first query is pretty simple in that I'm looking at several fields from two different tables, no big deal.

    The second query calculates the years, months, days between two dates that are used in the first query. I'm stumped on how to combine the queries so that they place nice with each other and return results.

    Here's the first query ...

    select

    RTRIM(RTRIM(vpi.LastName) + ', ' + RTRIM(ISNULL(vpi.FirstName,''))) Employee,

    convert(varchar,vpi.FromEffectiveDate,101) PositionStart,

    convert(varchar,vpi.ToEffectiveDate,101) PositionChange,

    convert(varchar,vpi.PositionStartDate,101) PositionStartDate,

    vpi.PositionReason, vpi.PositionCode, vpc.PositionCodeDescription

    from vhrl_positioninfo vpi

    inner join position_codes vpc on vpi.PositionCode = vpc.PositionCode

    Here's the second query ...

    select

    [Age] = convert(varchar, [Years]) + ' Years ' +

    convert(varchar, [Months]) + ' Months ' +

    convert(varchar, [Days]) + ' Days', *

    from

    (

    select

    [Years] = case when BirthDayThisYear <= Today

    then datediff(year, BirthYearStart, CurrYearStart)

    else datediff(year, BirthYearStart, CurrYearStart) - 1

    end,

    [Months]= case when BirthDayThisYear <= Today

    then datediff(month, BirthDayThisYear, Today)

    else datediff(month, BirthDayThisYear, Today) + 12

    end,

    [Days]= case when BirthDayThisMonth <= Today

    then datediff(day, BirthDayThisMonth, Today)

    else datediff(day, dateadd(month, -1, BirthDayThisMonth), Today)

    end,

    Birth = convert(varchar(10) ,Birth, 121),

    Today = convert(varchar(10), Today, 121)

    from

    (

    select BirthDayThisYear =

    case when day(dateadd(year, datediff(year, BirthYearStart, CurrYearStart), Birth)) <> day(Birth)

    then dateadd(day, 1, dateadd(year, datediff(year, BirthYearStart, CurrYearStart), Birth))

    else dateadd(year, datediff(year, BirthYearStart, CurrYearStart), Birth)

    end,

    BirthDayThisMonth =

    case when day(dateadd(month, datediff(month, BirthMonthStart, CurrMonthStart), Birth)) <> day(Birth)

    then dateadd(day, 1, dateadd(month, datediff(month, BirthMonthStart, CurrMonthStart), Birth))

    else dateadd(month, datediff(month, BirthMonthStart, CurrMonthStart), Birth)

    end,

    *

    from

    (

    select BirthYearStart = dateadd(year, datediff(year, 0, Birth), 0),

    CurrYearStart = dateadd(year, datediff(year, 0, Today), 0),

    BirthMonthStart = dateadd(month, datediff(month, 0, Birth), 0),

    CurrMonthStart = dateadd(month, datediff(month, 0, Today), 0),

    *

    from

    (

    select birth = convert(datetime, fromeffectivedate) ,

    Today = case when convert(datetime, toeffectivedate) = '3000-01-01'

    THEN convert(datetime, convert(int,getdate()))

    else vpi.toeffectivedate

    end

    from vHRL_PositionInfo vpi inner join position_codes vpc

    on vpi.PositionCode = vpc.PositionCode

    ) aaaa

    ) aaa

    ) aa

    )a

    Here's the sample data ...

    vpi table ...

    LastName FirstName FromEffectiveDate ToEffectiveDate PositionStartDate PositionReason PositionCode

    Doe John 2001-10-15 3000-01-01 10-15-2001 Transfer OperPack

    Smith Tom 1994-11-28 2001-10-14 1994-11-28 New Hire OperDC

    vpc table ...

    PositionCode PositionDescription

    OperPack Pack Line Operator

    OperDC Descaler Operator

    This is what the results should look like ...

    John, Doe 2001-10-15 3000-01-01 10-15-2001 Transfer OperPack Pack Line Operator 6 Years 11 Months 16 Days

    John, Doe 1994-11-28 2001-10-14 1994-11-28 New Hire OperDC Descaler Operator 6 Years 6 Months 19 Days

    I know the date calculation piece adds 5 additional fields to the end, but they are not needed for the final report. Any help would be greatly appreciated! Thank you! Jena

  • That's a query and a half! You'll have to forgive me if I don't work out what you're actually trying to achieve!

    The easiest way to combine them would be to put the first query inside the innermost layer of the second, and then make sure that is passed all the way up...

    so the innermost part is:

    (

    select

    RTRIM(RTRIM(vpi.LastName) + ', ' + RTRIM(ISNULL(vpi.FirstName,''))) Employee,

    convert(varchar,vpi.FromEffectiveDate,101) PositionStart,

    convert(varchar,vpi.ToEffectiveDate,101) PositionChange,

    convert(varchar,vpi.PositionStartDate,101) PositionStartDate,

    vpi.PositionReason, vpi.PositionCode, vpc.PositionCodeDescription,

    birth = convert(datetime, fromeffectivedate) ,

    Today = case when convert(datetime, toeffectivedate) = '3000-01-01'

    THEN convert(datetime, convert(int,getdate()))

    else vpi.toeffectivedate

    end

    from vHRL_PositionInfo vpi inner join position_codes vpc

    on vpi.PositionCode = vpc.PositionCode

    ) aaaa

    Apart from that you'll need to add a ,* to the section that starts SELECT [years] =

    Pete

  • Pete,

    You are the best! That explanation actually makes more sense than other things that I have tried!

    Better yet, it works with one other slight modification (eliminate Birth & Today from select [Years] block of code).

    I am so relieved this works! Thank you!

    Jena

Viewing 3 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic. Login to reply