Thread: Query returns 0 for subsequent columns

Query returns 0 for subsequent columns

From
"Keith Worthington"
Date:
Hi All,

I am working on the query below (having made great progress thanks to your
help) and have run into a result I do not understand.

When I run the query I get 0 for all columns when the committed column is 0.
If I edit the souce table of the first join so that the committed column is
nonzero suddenly the other columns return their values.  What might cause this
behavior?

Original result:
CAB2-100  | 4 | 0 | 20
CAB2-1000 | 0 | 0 |  0

Result with modified source tables.
CAB2-100  | 4 | 0 | 20
CAB2-1000 | 1 | 3 |  5

Kind Regards,
Keith

SELECT items.id,
       COALESCE(sales.sum, 0) AS committed,
       COALESCE(purchases.sum, 0) AS on_order,
       COALESCE(stock.quantity, 0) AS on_hand
  FROM peachtree.tbl_item AS items
LEFT OUTER JOIN (
                  SELECT sales_order.tbl_line_item.item_id,
                         SUM(sales_order.tbl_line_item.quantity) as sum
                  FROM sales_order.tbl_line_item JOIN sales_order.tbl_detail
USING (number)
                  WHERE NOT sales_order.tbl_detail.closed
                  GROUP BY item_id
                ) AS sales ON (items.id = sales.item_id)
LEFT OUTER JOIN (
                  SELECT purchase_order.tbl_line_item.item_id,
                         SUM(purchase_order.tbl_line_item.quantity) as sum
                  FROM purchase_order.tbl_line_item JOIN
purchase_order.tbl_detail USING (po_number)
                  WHERE NOT purchase_order.tbl_detail.closed
                  GROUP BY item_id
                ) AS purchases USING (item_id)
LEFT OUTER JOIN (
                  SELECT DISTINCT ON ( inventory.tbl_data.item_id )
                         inventory.tbl_data.item_id,
                         inventory.tbl_data.quantity
                    FROM inventory.tbl_data
                   ORDER BY inventory.tbl_data.item_id,
                         inventory.tbl_data.inventory_id DESC
                ) AS stock USING (item_id)
WHERE NOT items.inactive
ORDER BY item_id;

______________________________________________
99main Internet Services http://www.99main.com


Re: Query returns 0 for subsequent columns

From
"Keith Worthington"
Date:
Replying to myself in the hopes that this will help someone else.

It turns out my JOIN condition was what was causing a problem.

I changed the following
   AS purchases USING (item_id)
to
   AS purchases ON (items.id = purchases.item_id)
and
   AS stock USING (item_id)
to
   AS stock ON (items.id = stock.item_id)
and the query started to return the desired results.

I can see that the ON clause is a much clearer specification but I do not
understand 1) Why the original USING clause didn't generate an error since
item_id wasn't available in items and 2) Why giving the committed section a
value suddenly caused the other values to be returned.

Keith

---------- Forwarded Message -----------
From: "Keith Worthington" <keithw@narrowpathinc.com>
To: "PostgreSQL Novice" < pgsql-novice@postgresql.org>
Sent: Mon, 27 Dec 2004 13:04:03 -0500
Subject: Query returns 0 for subsequent columns

Hi All,

I am working on the query below (having made great progress thanks to your
help) and have run into a result I do not understand.

When I run the query I get 0 for all columns when the committed column is 0.
If I edit the souce table of the first join so that the committed column is
nonzero suddenly the other columns return their values.  What might cause this
behavior?

Original result:
CAB2-100  | 4 | 0 | 20
CAB2-1000 | 0 | 0 |  0

Result with modified source tables.
CAB2-100  | 4 | 0 | 20
CAB2-1000 | 1 | 3 |  5

Kind Regards,
Keith

SELECT items.id,
       COALESCE(sales.sum, 0) AS committed,
       COALESCE(purchases.sum, 0) AS on_order,
       COALESCE(stock.quantity, 0) AS on_hand
  FROM peachtree.tbl_item AS items
LEFT OUTER JOIN (
                  SELECT sales_order.tbl_line_item.item_id,
                         SUM(sales_order.tbl_line_item.quantity) as sum
                  FROM sales_order.tbl_line_item JOIN sales_order.tbl_detail
USING (number)
                  WHERE NOT sales_order.tbl_detail.closed
                  GROUP BY item_id
                ) AS sales ON (items.id = sales.item_id)
LEFT OUTER JOIN (
                  SELECT purchase_order.tbl_line_item.item_id,
                         SUM(purchase_order.tbl_line_item.quantity) as sum
                  FROM purchase_order.tbl_line_item JOIN
purchase_order.tbl_detail USING (po_number)
                  WHERE NOT purchase_order.tbl_detail.closed
                  GROUP BY item_id
                ) AS purchases USING (item_id)
LEFT OUTER JOIN (
                  SELECT DISTINCT ON ( inventory.tbl_data.item_id )
                         inventory.tbl_data.item_id,
                         inventory.tbl_data.quantity
                    FROM inventory.tbl_data
                   ORDER BY inventory.tbl_data.item_id,
                         inventory.tbl_data.inventory_id DESC
                ) AS stock USING (item_id)
WHERE NOT items.inactive
ORDER BY item_id;
------- End of Forwarded Message -------


Kind Regards,
Keith Worthington
President

Narrow Path, Inc.
520 Trumbull Highway
Lebanon, CT 06249-1424
Telephone:  (860) 642-7114
Facsimile:  (860) 642-7290
Mobile:     (860) 608-6101

______________________________________________
99main Internet Services http://www.99main.com