Re: Cross tabulations - Mailing list pgsql-sql

From Muhyiddin A.M Hayat
Subject Re: Cross tabulations
Date
Msg-id 005a01c4ba6f$9830fce0$4f00a8c0@middinks
Whole thread Raw
In response to Cross tabulations  ("Muhyiddin A.M Hayat" <middink@indo.net.id>)
List pgsql-sql
Dear,

Thanks, that query is work, so.
So, i would like to calculate total work time




select date, employee_id,      (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'In') as in,      (select check_time-check_time::date from test
whereemployee_id =
 
x.employee_id and check_time::date = date and state = 'Break Out') as
break_out,      (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'Break In') as
break_in,      (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'Out') as out from (select distinct employee_id, check_time::date
asdate from test) as
 
x;


out - in = work_time






----- Original Message ----- 
From: "Greg Stark" <gsstark@mit.edu>
To: "Muhyiddin A.M Hayat" <middink@indo.net.id>
Cc: <pgsql-sql@postgresql.org>
Sent: Wednesday, October 20, 2004 2:35 PM
Subject: Re: [SQL] Cross tabulations


> "Muhyiddin A.M Hayat" <middink@indo.net.id> writes:
>
> > Dear all,
> >
> > I need to do something similar to a cross tabulation, but without any
> > aggregation.
>
> join your table to itself four times:
>
> select *
>   from (select check_time::date as date, employee_id,
check_time-check_time::date as in from test where state = 'In') as a
>   join (select check_time::date as date, employee_id,
check_time-check_time::date as break_out from test where state = 'Break
Out') as b using (employee_id,date)
>   join (select check_time::date as date, employee_id,
check_time-check_time::date as break_in from test where state = 'Break In')
as d using (employee_id,date)
>   join (select check_time::date as date, employee_id,
check_time-check_time::date as out from test where state = 'Out') as e using
(employee_id,date) ;
>
> Note that this will do strange things if you don't have precisely four
records
> for each employee.
>
> Alternatively use subqueries:
>
> select date, employee_id,
>        (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'In') as in,
>        (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'Break Out') as
break_out,
>        (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'Break In') as
break_in,
>        (select check_time-check_time::date from test where employee_id =
x.employee_id and check_time::date = date and state = 'Out') as out
>   from (select distinct employee_id, check_time::date as date from test)
as x;
>
> This will at least behave fine if there are missing records and will give
an
> error if there are multiple records instead of doing strange things.
>
> Neither of these will be particularly pretty on the performance front.
>
> -- 
> greg
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings
>




pgsql-sql by date:

Previous
From: "cristivoinicaru"
Date:
Subject: sql
Next
From: "Andrei Bintintan"
Date:
Subject: Re: sql