roberto wrote:
Dear friends,
I have this table

table work{
day date,
hour integer,
}

select * from work;

date         |     text
-----------
1-1-2003    1
1-1-2003    1
2-1-2003    5
3-1-2003    10
5-1-2003    15

how can i obtain this?

date         |    text
-----------
1-1-2003    2
2-1-2003    5
3-1-2003    10
4-1-2003    null
5-1-2003    15
6-1-2003    null



First , you need a sequence of days. Just create a function like this:

CREATE OR REPLACE FUNCTION dateseq ( DATE , DATE )
RETURNS SETOF DATE
LANGUAGE 'plpgsql'
AS '
  DECLARE
    bdate ALIAS FOR $1 ;
    edate ALIAS FOR $2 ;
    cdate DATE ;
  BEGIN
    cdate := bdate;
    WHILE cdate <= edate LOOP
      RETURN NEXT cdate ;
      cdate := CAST ( cdate + interval ''1 day'' AS date );
    END LOOP;
    RETURN;
  END;
';

The function is like a table/view , where the fist function argument
is the start date , the second argument is the end date.

Now try :

SELECT ds.day, sum(w.hour)
FROM dateseq( '2003-1-1', '2003-1-6' ) AS ds (day)
LEFT JOIN work w ON ds.day=w.day
GROUP BY ds.day;

Regards, Janko
--
Janko Richter


---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly

Reply via email to