2012-12-13 25 views
5

Więc nie rozumiem, dlaczego daje ten błąd. jest wartością pola "Numer produktu"? .. Mam zapytanie z UNION ALL, co powoduje, że pierwszy wiersz pokazuje całkowitą sumę innych wierszy. Moje zapytanie jest dość długie, więc nie opublikuję go (ale jeśli będzie to konieczne, opublikuję to).PostgreSQL - DataError: nieprawidłowa składnia wejściowa dla typu numerycznego: "Produkt"

Więc najpierw dam fragment mojego kodu:

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 

Więc używam kolumny produkt, aby pokazać się w pierwszym rzędzie jako „produkt” (bo nie trzeba obliczyć w tej dziedzinie . pierwszy wiersz Ale obliczyć pozostałe pola łącznie)

Gdy uruchomię mojej kwerendy wyprowadza ten błąd:

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

EDIT: wersja PostgreSQL 8.4

Pełna zapytania:

(
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

czy możesz opublikować pełny skrypt SQL – EdChum

+0

OK, jutro opublikuję. – Andrius

+0

Proszę * zawsze * dołączać swoją wersję PostgreSQL i pełny kod, o który pytasz w swoich pytaniach. –

Odpowiedz

6

Ok dowiedziałem się, co się stało. Głupi ja:). Dało to błąd, ponieważ główna część zapytania, wybór kolejności kolumn była błędna (mimo że w moim systemie jest ona porządkowana przy użyciu interfejsu graficznego, ale w tym przypadku, przy użyciu UNION ALL, kolumny muszą być również poprawnie zamawiane). Zmieniłem więc kolejność tak, aby była taka sama jak w pierwszym rzędzie i zadziałało.

+1

Dzięki za kontynuację, +1 –

Powiązane problemy