2012-12-13 82 views
5

所以我不明白爲什麼會出現這個錯誤。是字段值「產品」數字?.. 我有UNION ALL查詢,它使第一行顯示其他行的總和。我的查詢時間很長,所以我不會發布它(但如果有必要,我會發布它)。PostgreSQL - DataError:數字類型的無效輸入語法:「Product」

所以首先我會給我的代碼片段:

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 

所以我使用的產品列在第一行的「產品」(對,因爲我不需要在此字段來計算。第一行,但計算等領域總數)

當我運行我的查詢它輸出這樣的錯誤:

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

編輯: 的PostgreSQL 8.4版

全面查詢:

(
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 
+0

你可以發佈完整的SQL腳本嗎 – EdChum

+0

好吧,明天我會發布它。 – Andrius

+0

請始終*包含您的PostgreSQL版本以及您在問題中詢問的完整代碼。 –

回答

6

好,我發現了什麼是錯誤的。愚蠢的我:)。它給出了這個錯誤,因爲查詢的主要部分,選擇列順序是錯誤的(即使在我的系統中它正在使用圖形界面進行排序,但在這種情況下,使用UNION ALL時,列也需要正確排序)。所以我改變了秩序,就像它在第一行,它的工作。

+1

感謝您跟進,+1 –

相關問題