Received: from localhost (maia-3.hub.org [200.46.204.184]) by postgresql.org (Postfix) with ESMTP id 1830F9FBA21 for ; Tue, 19 Jun 2007 10:40:24 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.184]) (amavisd-maia, port 10024) with ESMTP id 62503-05 for ; Tue, 19 Jun 2007 10:40:10 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.5 Received: from hu-out-0506.google.com (hu-out-0506.google.com [72.14.214.236]) by postgresql.org (Postfix) with ESMTP id 18D4C9FB82F for ; Tue, 19 Jun 2007 10:40:17 -0300 (ADT) Received: by hu-out-0506.google.com with SMTP id 22so978274hug for ; Tue, 19 Jun 2007 06:40:16 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=bm5BJmJi2eUf0gaOUYP+A5dYJQicPEuF9pzs1kDa8DfVwZiz8MbfSSEQO2K9pvCT+Z97XibK8gfBCr/wH/zS+cmGLsmJBngbc4MzEcZaiBKLDQyH3fV/Y7PWmg8tQkOhd5hWg92WcYnwFT5J4KtcjQ4g8249ctsOkWAjoxav9Jo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=XN2MDkF3W3X91xL9HdtF0znBS5oqSiBQPaImCPP8mt+r5XuR9BBV6xgLWvlE5AcMQp4i0NVlk26/EEgc6HIYv3gieLr2JxBC/29Sf+ZZPv5yGPLASsq04kNtksUbDta/s1CsiL4fQkpAf+h5vG9yhKfDddKkw91N02s8tNrj1HI= Received: by 10.78.140.17 with SMTP id n17mr2871395hud.1182260416103; Tue, 19 Jun 2007 06:40:16 -0700 (PDT) Received: by 10.78.18.9 with HTTP; Tue, 19 Jun 2007 06:40:16 -0700 (PDT) Message-ID: Date: Tue, 19 Jun 2007 09:40:16 -0400 From: "Merlin Moncure" To: "Ranieri Mazili" Subject: Re: Subquery problems Cc: pgsql-general@postgresql.org, pgsql-sql@postgresql.org In-Reply-To: <4677C952.9060902@terra.com.br> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <4677C952.9060902@terra.com.br> X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0.001 tagged_above=0 required=5 tests=BAYES_50=0.001 X-Spam-Level: X-Archive-Number: 200706/1149 X-Sequence-Number: 115972 On 6/19/07, Ranieri Mazili wrote: > > Hello, > > I'm having another "problem", I have a function that declares 12 variable, > one per month and each them execute a select like bellow: > DIV_MES01 := (select count(distinct production_date) from production where > extract(month from production_date) = '01' and extract(year from > production_date) = EXTRACT(YEAR FROM current_date)); > > Then, I need to check if the variable is equal 0: > IF DIV_MES01 = 0 THEN > DIV_MES01 := 1; > END IF; > > Finally, I perform the following query: > > SELECT cast(((sum(A.qty_employees_total) > -(sum(A.qty_absence) > -sum(A.qty_vacation) > -sum(A.qty_diseased) > -sum(A.qty_indirect) > -sum(A.qty_transferred)) > +sum(A.qty_received))/DIV_MES01) AS integer), > C.id_production_area, > cast('01' as text) AS mes > FROM head_count A, machine B, machine_type C > WHERE EXTRACT(YEAR FROM head_count_date) = EXTRACT(YEAR FROM > current_date) > AND EXTRACT(MONTH FROM head_count_date) = '01' > AND A.id_machine = B.id_machine > AND B.id_machine_type = C.id_machine_type > GROUP BY C.id_production_area, B.id_machine_type > > Doing it, I need to perform 12 querys united by "UNION", what I want to do > is unify it in only one query, I tryed with the query bellow: > > SELECT date_trunc('month', A.head_count_date)::date as head_date, > cast(((sum(A.qty_employees_total) > -(sum(A.qty_absence) > -sum(A.qty_vacation) > -sum(A.qty_diseased) > -sum(A.qty_indirect) > -sum(A.qty_transferred)) > +sum(A.qty_received))/(select count(distinct production_date) > from production > where extract(month from > production_date) = EXTRACT(MONTH FROM date_trunc('month', > A.head_count_date)::date) > and extract(year from > production_date) = EXTRACT(YEAR FROM current_date))) AS integer), > C.id_production_area > FROM head_count A, machine B, machine_type C > WHERE date_trunc('month', A.head_count_date)::date BETWEEN > date_trunc('month', current_date - (EXTRACT(MONTH FROM > current_date)-1) * interval '1 month')::date > AND date_trunc('month', current_date)::date > AND A.id_machine = B.id_machine > AND B.id_machine_type = C.id_machine_type > GROUP BY C.id_production_area, B.id_machine_type, head_count_date,head_date > ORDER BY id_production_area, head_count_date,head_date DESC > > But the results aren't what I want. > What I trying to do is possible? > > I appreciate any help. > Thanks sure!. SELECT cast(((sum(A.qty_employees_total) -(sum(A.qty_absence) -sum(A.qty_vacation) -sum(A.qty_diseased) -sum(A.qty_indirect) -sum(A.qty_transferred)) +sum(A.qty_received))/DIV_MES01) AS integer), C.id_production_area, cast(DIV_MES01 as text) AS mes FROM head_count A, machine B, machine_type C, ( select case when ct = 0 then 1 else ct end as DIV_MES01 from ( select count(distinct production_date) as ctfrom production where extract(year from production_date) = EXTRACT(YEAR FROM current_date) ) q ) D WHERE EXTRACT(YEAR FROM head_count_date) = EXTRACT(YEAR FROM current_date) AND EXTRACT(MONTH FROM head_count_date) = DIV_MES01 AND A.id_machine = B.id_machine AND B.id_machine_type = C.id_machine_type GROUP BY C.id_production_area, B.id_machine_type; ok, I didn't syntax check this monster, but it should give you a start...the trick is to use an 'inline view' to expand your variable list into a set. merlin