2017-08-18 2 views
1

Je suis un débutant avec SQL. J'utilise Teradata. Nous essayons de rassembler les données pour comparer les données réelles par rapport aux prévisions.Ajouter deux tables - Union ne fonctionne pas en SQL (Teradata)

Voici mon code:

select 
'Actuals' as fc_version, 
A.tra_fiscal_year as fiscal_year, 
A.tra_fiscal_week as fiscal_week, 
A.tra_allocation_category_code as category, 
A.tra_grand_pricing_sales_channel as grandparent_channel, 
D.fc_prod_id, 
coalesce(
case 
when A.tra_ticket_product_code like 'A%' then 'Total' 
else null 
end, 

case 
when A.tra_grand_pricing_sales_channel = 'INMKT' Then 'In Market' 
else 'All Other' 
end) 
as fc_sales_channel, 

sum(A.tra_ticket_quantity) as units_sold, 

from ((pd_plan_forecast_db.adm_rev_detail A 
left outer join 
pd_plan_forecast_db.adm_rev_prod_code_to_fc_id B 
on (A.tra_ticket_product_code = B.product_code)) 
left outer join 
pd_plan_forecast_db.adm_rev_ticket_code_to_fc_id C 
on (A.tra_ticket_code = C.ticket_code) 
left outer join 
pd_plan_forecast_db.adm_rev_fc_prod_info D 
on (coalesce(B.fc_prod_id, C.fc_prod_id) = D.fc_prod_id)) 

group by 1, 2, 3, 4, 5, 6, 7 

union 

select fc_version, fiscal_year, fiscal_week, category, null as grandparent_channel, fc_prod_id, fc_sales_channel, sum(units_sold) as units_sold 
from pd_plan_forecast_db.adm_rev_fc 
where fiscal_year = 2017 and fiscal_week = 1 
group by 1,2,3,4,5,6,7 

Si vous collez la première partie avant l'union, il a le bon résultat. De même avec la deuxième partie après l'union.

Mais l'ensemble du code donne l'erreur: SELECT Failed. [3654] Les expressions select-list correspondantes sont incompatibles.

Voici une idée générale des tables que j'utilise. enter image description here

Répondre

2

Vous devez avoir le même nombre de colonnes dans les deux parties (haut et bas) ainsi que le même type de données. Autant que je peux compter, il y a 9 colonnes dans la requête du haut et 8 dans le bas.

UPD: le correctif selon l'auteur est convertir null en chaîne vide dans la requête ci-dessous.

+1

Merci! C'était une simple correction de passer d'un null à un devis vide. – bov25

1

Vous devriez avoir le même nombre de colonnes dans la remorque sélectionner et (le nombre semble 8 dans les deux select) mais
dans votre union, vous ne devez pas utiliser alias dans la deuxième sélection

select 
'Actuals' as fc_version, 
A.tra_fiscal_year as fiscal_year, 
A.tra_fiscal_week as fiscal_week, 
A.tra_allocation_category_code as category, 
A.tra_grand_pricing_sales_channel as grandparent_channel, 
D.fc_prod_id, 
coalesce(
case 
when A.tra_ticket_product_code like 'A%' then 'Total' 
else null 
end, 

case 
when A.tra_grand_pricing_sales_channel = 'INMKT' Then 'In Market' 
else 'All Other' 
end) 
as fc_sales_channel, 

sum(A.tra_ticket_quantity) as units_sold, 

from ((pd_plan_forecast_db.adm_rev_detail A 
left outer join 
pd_plan_forecast_db.adm_rev_prod_code_to_fc_id B 
on (A.tra_ticket_product_code = B.product_code)) 
left outer join 
pd_plan_forecast_db.adm_rev_ticket_code_to_fc_id C 
on (A.tra_ticket_code = C.ticket_code) 
left outer join 
pd_plan_forecast_db.adm_rev_fc_prod_info D 
on (coalesce(B.fc_prod_id, C.fc_prod_id) = D.fc_prod_id)) 

group by 1, 2, 3, 4, 5, 6, 7 

union 

select 
    fc_version 
    , fiscal_year 
    , fiscal_week 
    , category 
    , null 
    , fc_prod_id 
    , fc_sales_channel 
    , sum(units_sold) 
from pd_plan_forecast_db.adm_rev_fc 
where fiscal_year = 2017 and fiscal_week = 1 
group by 1,2,3,4,5,6,7 
+0

L'alias n'a pas d'importance (le résultat utilise toujours le nom de colonne du 1er Select), c'est le type de données qui ne correspond pas. Dans Teradata, une valeur NULL a un type de données INT (ne demandez pas pourquoi, c'est similaire dans Oracle) – dnoeth