On 02-Apr-2012 08:56 , Dave wrote:
I'm getting in a real twist with this one :
Given a table with a client and his children with their dates of
birth, I want to select those clients having at least one child aged
over 20 AND at least one child under 20.
  For lack of DDL to describe the problem, I will make-up a TABLE with 
a solution both reflecting that TABLE DDL as a given and very specific 
to the one-over and one-under; as not very extensible for answering more 
diverse questions per use of MIN and MAX:
<code>
    create table qtemp/cbd (c dec, bd date) /* C:client, BD:BirthDate */
    ; -- each BD is a separate row for each child of the client C
    insert into  qtemp/cbd values
      (3, current date-22 years), (3, current date-18 years) /* 3 Slt */
    , (1, current date-22 years) /* just 1, so too few          1 Omt */
    , (2, current date-22 years), (2, current date-20 years)
    , (2, current date-18 years), (2, current date-18 years) /* 2 Slt */
    , (4, current date- 5 years), (4, current date- 2 years)
    , (4, current date) /* 3, but all too young                 4 Omt */
    , (5, current date-22 years), (5, current date-22 years)
    , (5, current date-22 years) /* 3, triplets, all too old    5 Omt */
    , (6, current date-22 years)
    , (6, current date-20 years) /* 2, one equals 20 years so?  6 ??? */
    ; -- clients 3 and 2 meet the given selection criteria
    select c
      /* , min(int((current date-bd)/10000)) */
      /* , max(int((current date-bd)/10000)) */
    from qtemp/cbd
    group by c
    having count(*)>1
       and min(int((current date-bd)/10000)) < 20
       and max(int((current date-bd)/10000)) > 20
    ; -- clients 3 and 2 are selected for output, without ordering
</code>
Regards, Chuck
As an Amazon Associate we earn from qualifying purchases.