Thread: UNION question
Is the following even possible? I keep getting a syntax error at the last WHERE: ERROR: syntax error at or near "WHERE" LINE 20: WHERE p.part_id=379 AND t.machine_type_id=1 The SQL is SELECT t.name AS machine_type_name, j.workorder, round(sum(EXTRACT(epoch FROM(j.clockout- j.clockin))/3600/w.quantity_made)::numeric,2) AS avgtime NULL AS employees FROM jobclock j JOIN employee e ON e.employee_id=j.employee_id JOIN machine m ON m.machine_id=j.machine_id JOIN machine_type t ON t.machine_type_id=m.machine_type_id JOIN workorder w ON w.workorder=j.workorder JOIN part p ON p.part_id=w.part_id UNION SELECT t.name AS machine_type_name, NULL AS workorder, h.time AS avgtime, employees FROM part_time_historical h JOIN machine_type t ON t.machine_type_id=h.machine_type_id WHERE h.part_id=379 AND h.machine_type_id=1 WHERE p.part_id=379 AND t.machine_type_id=1 GROUP BY t.name,j.workorder ORDER BY avgtime I tried moving the last group of WHERE, GROUP BY, and ORDER BY before the UNION with the query it belongs to, but that results in a different syntax error. I'm basically looking to concatenate these two results. -- Brandon
> -----Original Message----- > From: pgsql-general-owner@postgresql.org [mailto:pgsql-general- > owner@postgresql.org] On Behalf Of Brandon Metcalf > Sent: Friday, July 10, 2009 12:16 PM Change it to this: > SELECT t.name AS machine_type_name, > j.workorder, > round(sum(EXTRACT(epoch FROM(j.clockout- > j.clockin))/3600/w.quantity_made)::numeric,2) > AS avgtime > NULL AS employees > FROM jobclock j > JOIN employee e ON e.employee_id=j.employee_id > JOIN machine m ON m.machine_id=j.machine_id > JOIN machine_type t ON t.machine_type_id=m.machine_type_id > JOIN workorder w ON w.workorder=j.workorder > JOIN part p ON p.part_id=w.part_id > WHERE p.part_id=379 > UNION > SELECT t.name AS machine_type_name, > NULL AS workorder, > h.time AS avgtime, > employees > FROM part_time_historical h > JOIN machine_type t ON > t.machine_type_id=h.machine_type_id > WHERE h.part_id=379 AND h.machine_type_id=1 > WHERE t.machine_type_id=1 > GROUP BY t.name,j.workorder > ORDER BY avgtime Matthew Hartman Programmer/Analyst Information Management, ICP Kingston General Hospital.now.
> > From: pgsql-general-owner@postgresql.org [mailto:pgsql-general- > > owner@postgresql.org] On Behalf Of Brandon Metcalf > > Sent: Friday, July 10, 2009 12:16 PM > > Change it to this: Sorry, I forgot that you need to split the GROUP BY clause as well in a similar manner to the WHERE clause. And unless you have duplicate rows to eliminate, use UNION ALL rather than UNION for a speed increase. Matthew Hartman Programmer/Analyst Information Management, ICP Kingston General Hospital .now.
Brandon Metcalf <brandon@geronimoalloys.com> writes: > I tried moving the last group of WHERE, GROUP BY, and ORDER BY before > the UNION with the query it belongs to, but that results in a > different syntax error. I think that's probably what you want to do. What you're missing is you need parentheses to put an ORDER BY into an arm of a UNION: (SELECT ... ORDER BY ...) UNION SELECT ... Otherwise it wants to consider the ORDER BY as applying to the UNION output. regards, tom lane
M == Matthew.Hartman@krcc.on.ca writes: M> > > From: pgsql-general-owner@postgresql.org [mailto:pgsql-general- M> > > owner@postgresql.org] On Behalf Of Brandon Metcalf M> > > Sent: Friday, July 10, 2009 12:16 PM M> > M> > Change it to this: M> Sorry, I forgot that you need to split the GROUP BY clause as well in a M> similar manner to the WHERE clause. And unless you have duplicate rows M> to eliminate, use UNION ALL rather than UNION for a speed increase. Thanks. Got it to work. -- Brandon
t == tgl@sss.pgh.pa.us writes: t> Brandon Metcalf <brandon@geronimoalloys.com> writes: t> > I tried moving the last group of WHERE, GROUP BY, and ORDER BY before t> > the UNION with the query it belongs to, but that results in a t> > different syntax error. t> I think that's probably what you want to do. What you're missing is t> you need parentheses to put an ORDER BY into an arm of a UNION: t> (SELECT ... ORDER BY ...) UNION SELECT ... t> Otherwise it wants to consider the ORDER BY as applying to the UNION t> output. Indeed. It was the fact that I was trying to move the ORDER BY along with WHERE and GROUP BY that was giving me grief. Thanks. -- Brandon