Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PostgreSQL - DataError: invalid input syntax for type numeric: "Product"

Tags:

sql

postgresql

So I don't understand why it gives this error. is field value "Product" numeric?.. I have query with UNION ALL, which makes first row to show total sum of other rows. My query is quite long, so I will not post it (but if it is necessary then I will post it).

So first I will give snippet of my code:

with w as (
SELECT
...
CASE x.variants WHEN x.variants THEN x.product || ' - ' || x.variants else x.product END as product
...

) 

SELECT 
...
'Product' as product,
...
UNION ALL
SELECT * FROM w

So I'm using product column to show in first row as 'Product' (because I don't need to calculate in this field of first row. But calculate other fields total)

When I run my query it outputs this error:

DataError: invalid input syntax for type numeric: "Product"
LINE 104: 'Product' as product,

EDIT: PostgreSQL version 8.4

Full query:

(
with w as (SELECT
min(fld2.id) AS id, -- note. Posted code is working now, but this select part was not
fld2.partner as partner, -- the same that is at the bottom (where different first line
fld2.product as product, -- is queried. So that gave error.
fld2.qty1 as qty1,
fld2.qty2 as qty2,
fld2.q1 as q1,
fld2.q2 as q2,
CASE WHEN (q1 >= q2 and q2 != 0) THEN ((q1-q2)/q2) * 100 WHEN (q1=0 or q2=0) THEN NULL WHEN (q2 > q1 and q1!=0) THEN ((q1/q2)-1)*100 END as percent_q,
fld2.price_q as price_q,
fld2.y1  as y1,
fld2.y2 as y2,
CASE WHEN (y1 >= y2 and y2 != 0) THEN ((y1-y2)/y2) * 100 WHEN (y1=0 or y2=0) THEN NULL WHEN (y2 > y1 and y1!=0) THEN ((y1/y2)-1)*100 END as percent_y,
fld2. price_y as price_y

FROM
(
SELECT 
min(x.id) AS id,
x.partner as partner,
--quarter as quarter,
CASE x.variants WHEN x.variants THEN x.product || ' - ' || x.variants else x.product END as product,
sum(case when (calcyear=DATE_PART('year',  now()) and x.quarter=3) then x.qty else 0 end) as qty1,
sum(case when (calcyear=DATE_PART('year',  now() - '1 year'::interval) and x.quarter=3) then x.qty else 0 end) as qty2,
sum(case when (calcyear=DATE_PART('year',  now()) and x.quarter=3) then price_unit else 0 end) as q1,
sum(case when (calcyear=DATE_PART('year',  now() - '1 year'::interval) and x.quarter=3) then price_unit else 0 end) as q2,
sum(case calcyear when  DATE_PART('year',  now()) then price_unit else 0 end) as y1,
sum(case calcyear when DATE_PART('year',  now() - '1 year'::interval) then price_unit else 0 end) as y2,
sum(case when (calcyear=DATE_PART('year',  now()) and x.quarter=3) then price_unit WHEN (calcyear=DATE_PART('year',  now() - '1 year'::interval)  and x.quarter=3) THEN -1*price_unit end) AS price_q,
sum(case when calcyear=DATE_PART('year',  now()) then price_unit ELSE -1*price_unit end) AS price_y
FROM (
  SELECT
    min(so.id) as id,
    DATE_PART('year',  so.date_order) AS calcyear,
    DATE_PART('quarter',  so.date_order) AS quarter,
   sol.price_unit as price_unit,
   rp.name as partner,
   pt.name as product,
   pp.variants as variants,
   sol.product_uom_qty as qty
FROM 
sale_order AS so 
INNER JOIN sale_order_line AS sol ON (sol.order_id = so.id)
INNER JOIN res_partner as rp ON (so.partner_id = rp.id)
INNER JOIN product_product as pp ON (sol.product_id=pp.id)
INNER JOIN product_template as pt ON (pp.product_tmpl_id=pt.id)
WHERE EXISTS(
SELECT * FROM  res_partner_category_rel rpcl
WHERE 
rpcl.partner_id=rp.id and rpcl.category_id=37
and (so.date_order >= date_trunc('year', now() - '1 year'::interval)::timestamp::date  and so.date_order <= date_trunc('year', now()+ '1 year'::interval)::timestamp::date-1 )
and rp.distributor=True and rp.active=True
and so.state != 'cancel'
)
GROUP BY
variants,
calcyear,
quarter,
price_unit,
partner,
product,
qty
) AS x
GROUP BY
 partner,
x.variants,
x.product
ORDER BY
  partner
)fld2
GROUP BY
partner,
q1,
q2,
y1,
y2,
qty1,
qty2,
product,
price_q,
price_y,
percent_q,
percent_y
ORDER BY 
partner
)
SELECT
1111 as id,
'Viso' as partner,
'Product' as product,
sum(uf.qty1) as qty1,
sum(uf.qty2) as qty2,
sum(uf.q1) as q1,
sum(uf.q2) as q2,
sum(CASE WHEN (uf.q1 >= uf.q2 and uf.q2 != 0) THEN ((uf.q1-uf.q2)/uf.q2) * 100 WHEN (uf.q1=0 or uf.q2=0) THEN NULL WHEN (uf.q2 > uf.q1 and uf.q1!=0) THEN ((uf.q1/uf.q2)-1)*100 END) as percent_q,
sum(uf.price_q) as price_q,
sum(uf.y1)  as y1,
sum(uf.y2) as y2,
sum(CASE WHEN (uf.y1 >= uf.y2 and uf.y2 != 0) THEN ((uf.y1-uf.y2)/uf.y2) * 100 WHEN (uf.y1=0 or uf.y2=0) THEN NULL WHEN (uf.y2 > uf.y1 and uf.y1!=0) THEN ((uf.y1/uf.y2)-1)*100 END) as percent_y,
sum(uf.price_y) as price_y
FROM 
(
SELECT 
sum(price_q) as price_q,
sum(price_y) as price_y,
sum(qty1) as qty1,
sum(qty2) as qty2,
sum(q1) as q1,
sum(q2) as q2,
sum(y1)  as y1,
sum(y2) as y2
FROM w
)uf
UNION ALL
SELECT * FROM w
) fld
like image 656
Andrius Avatar asked Dec 13 '12 12:12

Andrius


1 Answers

Ok I found out what was wrong. Stupid me:). It gave this error because main part of the query, select columns order was wrong (even though in my system it is being ordered by using graphical interface, but in this case, when using UNION ALL, columns need to be ordered correctly too). So I changed order to be the same as it is in the first row and it worked.

like image 177
Andrius Avatar answered Sep 27 '22 21:09

Andrius