X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id D5F133A3B4C for ; Mon, 25 Oct 2004 09:50:20 +0100 (BST) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 96656-08 for ; Mon, 25 Oct 2004 08:50:08 +0000 (GMT) Received: from smtp-1.indo.net.id (smtp-1.indo.net.id [202.159.32.91]) by svr1.postgresql.org (Postfix) with SMTP id 8E9983A2B23 for ; Mon, 25 Oct 2004 09:50:04 +0100 (BST) Received: (qmail 7289 invoked from network); 25 Oct 2004 15:49:55 +0700 Received: from smtp.indo.net.id (202.159.32.81) by smtp-1.indo.net.id with SMTP; 25 Oct 2004 15:49:55 +0700 Received: (qmail 14124 invoked from network); 25 Oct 2004 15:49:54 +0700 Received: from unknown (HELO middinks) (202.159.122.101) by smtp.indo.net.id with SMTP; 25 Oct 2004 15:49:54 +0700 Message-ID: <005a01c4ba6f$9830fce0$4f00a8c0@middinks> From: "Muhyiddin A.M Hayat" To: "Greg Stark" Cc: References: <012501c4b65f$9b70b620$4f00a8c0@middinks> <878ya128ya.fsf@stark.xeocode.com> Subject: Re: Cross tabulations Date: Mon, 25 Oct 2004 16:49:51 +0800 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1437 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.0 tagged_above=0.0 required=5.0 tests= X-Spam-Level: X-Archive-Number: 200410/166 X-Sequence-Number: 19269 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 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; out - in = work_time ----- Original Message ----- From: "Greg Stark" To: "Muhyiddin A.M Hayat" Cc: Sent: Wednesday, October 20, 2004 2:35 PM Subject: Re: [SQL] Cross tabulations > "Muhyiddin A.M Hayat" 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 >