Query Assistance

Started by Naz Gassiepabout 19 years ago3 messagesgeneral
Jump to latest
#1Naz Gassiep
naz@mira.net

Is anyone able to tell me why in the last column of the returned result set, the value calculated is always 0?

QUERY:

SELECT products.productid,
products.cost,
products.srp,
CASE WHEN products.srp > 0 THEN (products.srp - products.cost) * 100 / products.srp ELSE 0 END AS margin,
products.type,
products.gstexempt,
productpointvalues.earnvalue,
productpointvalues.redeemvalue,
productpointvalues.earnvalue / productpointvalues.redeemvalue AS redemptionmargin
FROM categories, products
LEFT OUTER JOIN productpointvalues USING (productid)
WHERE products.active IS TRUE
AND products.catid = categories.catid
AND products.catid = 2
ORDER BY products.name;

RESULT SET:

productid | cost | srp | margin | type | gstexempt | earnvalue | redeemvalue | redemptionmargin
-----------+-------+--------+----------------------+------+-----------+-----------+-------------+------------------
716 | 8.60 | 10.00 | 14.0000000000000000 | N | f | 50 | 1500 | 0
15 | 87.00 | 100.00 | 13.0000000000000000 | N | f | 500 | 10000 | 0
13 | 26.10 | 30.00 | 13.0000000000000000 | N | f | 150 | 3000 | 0
1189 | 0.00 | 40.00 | 100.0000000000000000 | N | f | 200 | 4000 | 0
14 | 43.50 | 50.00 | 13.0000000000000000 | N | f | 250 | 5000 | 0

#2Naz Gassiep
naz@mira.net
In reply to: Naz Gassiep (#1)
Re: Query Assistance

Indeed.
Thanks for that! I keep getting bitten by that too hehe.
- Naz.

William Garrison wrote:

Show quoted text

My guess is that integer division is to blame: 50 divided by 1500 =
0.03 which rounds to zero. You probably have to cast them to real
before doing the division.

Naz Gassiep wrote:

Is anyone able to tell me why in the last column of the returned
result set, the value calculated is always 0?

QUERY:

SELECT products.productid,
products.cost,
products.srp,
CASE WHEN products.srp > 0 THEN (products.srp -
products.cost) * 100 / products.srp ELSE 0 END AS margin,
products.type,
products.gstexempt,
productpointvalues.earnvalue,
productpointvalues.redeemvalue,
productpointvalues.earnvalue /
productpointvalues.redeemvalue AS redemptionmargin
FROM categories, products
LEFT OUTER JOIN productpointvalues USING (productid)
WHERE products.active IS TRUE
AND products.catid = categories.catid
AND products.catid = 2
ORDER BY products.name;

RESULT SET:

productid | cost | srp | margin | type | gstexempt
| earnvalue | redeemvalue | redemptionmargin
-----------+-------+--------+----------------------+------+-----------+-----------+-------------+------------------

716 | 8.60 | 10.00 | 14.0000000000000000 | N | f
| 50 | 1500 | 0
15 | 87.00 | 100.00 | 13.0000000000000000 | N | f
| 500 | 10000 | 0
13 | 26.10 | 30.00 | 13.0000000000000000 | N | f
| 150 | 3000 | 0
1189 | 0.00 | 40.00 | 100.0000000000000000 | N | f
| 200 | 4000 | 0
14 | 43.50 | 50.00 | 13.0000000000000000 | N | f
| 250 | 5000 | 0

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

#3William Garrison
postgres@mobydisk.com
In reply to: Naz Gassiep (#1)
Re: Query Assistance

My guess is that integer division is to blame: 50 divided by 1500 = 0.03
which rounds to zero. You probably have to cast them to real before
doing the division.

Naz Gassiep wrote:

Show quoted text

Is anyone able to tell me why in the last column of the returned result
set, the value calculated is always 0?

QUERY:

SELECT products.productid,
products.cost,
products.srp,
CASE WHEN products.srp > 0 THEN (products.srp -
products.cost) * 100 / products.srp ELSE 0 END AS margin,
products.type,
products.gstexempt,
productpointvalues.earnvalue,
productpointvalues.redeemvalue,
productpointvalues.earnvalue /
productpointvalues.redeemvalue AS redemptionmargin
FROM categories, products
LEFT OUTER JOIN productpointvalues USING (productid)
WHERE products.active IS TRUE
AND products.catid = categories.catid
AND products.catid = 2
ORDER BY products.name;

RESULT SET:

productid | cost | srp | margin | type | gstexempt |
earnvalue | redeemvalue | redemptionmargin
-----------+-------+--------+----------------------+------+-----------+-----------+-------------+------------------

716 | 8.60 | 10.00 | 14.0000000000000000 | N | f
| 50 | 1500 | 0
15 | 87.00 | 100.00 | 13.0000000000000000 | N | f
| 500 | 10000 | 0
13 | 26.10 | 30.00 | 13.0000000000000000 | N | f
| 150 | 3000 | 0
1189 | 0.00 | 40.00 | 100.0000000000000000 | N | f
| 200 | 4000 | 0
14 | 43.50 | 50.00 | 13.0000000000000000 | N | f
| 250 | 5000 | 0

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match