2017-07-26 1 views
0

J'ai vraiment bloqué avec une tâche. J'ai une table comme celui-ciRequête SQL Teradata pour trouver la somme des champs avec les mêmes valeurs de colonne

Departure | Arrival | SUM 
AAA  | ZZZ  | 100 
ZZZ  | AAA  | 50 
AAA  | CCC  | 60 

Je veux obtenir la somme des mêmes routes et la situation ici est que je traiter AAA-ZZZ et itinéraire ZZZ-AAA comme une route. La route ZZZ-AAA est juste le retour de la destination d'origine.

Je suis en train d'obtenir le résultat comme celui-ci:

Departure | Arrival | SUM 
AAA  | ZZZ  | 150 
AAA  | CCC  | 60 

Toutes les suggestions, les idées sur la façon dont il vous plaît puis-je écrire ma requête SQL pour y parvenir?

Cordialement, Jack

+1

Veuillez poster un [MCVE] afin de pouvoir jouer avec. Cela signifie que l'instruction 'CREATE TABLE' pour la table et les instructions' INSERT INTO' pour le remplir avec des exemples de données. –

+0

Doit-il retourner une combinaison existante? C'est à dire. Dans votre exemple, il n'y a que «AAA, CCC», CCC, AAA est un résultat valable aussi? Alors la réponse de Gordon échouera. – dnoeth

+0

Salut dnoeth, Merci pour votre commentaire. CCC-AAA n'est pas un résultat valide car dans ce cas, il n'y a pas de combinaison de routes dans la table d'origine (source). – Jack84

Répondre

0

Il suffit d'utiliser least() et greatest():

select least(Departure, Arrival) as Departure, 
     greatest(Departure, Arrival) as Arrival, 
     sum(al) 
from t 
group by least(Departure, Arrival), 
     greatest(Departure, Arrival); 
+0

Salut Gordon, Cela fonctionne parfaitement pour moi et résoudre mon problème. Merci beaucoup pour votre réponse rapide. Cordialement, Jack – Jack84

1

Si vous avez besoin de préserver l'ordre des colonnes (c.-à-a,b mais pas b,a devez retourner la combinaison existante) vous devez développer Gordon solution et ajoutez un indicateur pour la commande d'origine.

SELECT 
    -- MIN(flag) = 1 -> departure < arrival 
    --   = 2 -> arrival > departure or both exist 
    CASE WHEN Min(flag)=1 THEN #1 ELSE #2 END AS departure, 
    CASE WHEN Min(flag)=2 THEN #1 ELSE #2 END AS arrival, 
    Sum(sumcol) 
FROM 
(
    SELECT 
    Least(Departure, Arrival) AS #1, 
    Greatest(Departure, Arrival) AS #2, 
    sumcol, -- seems this is already result of an aggregation? 
    CASE WHEN departure < arrival THEN 1 ELSE 2 END AS flag 
    FROM nodupes 
) t 
GROUP BY #1,#2; 

Cela pourrait être encore simplifiée sans table dérivée, mais il est vraiment difficile à comprendre et il est le même de toute façon Expliquez.