2017-07-26 63 views
0

我真的坚持一个任务。 我有这样Teradata SQL查询找到具有相同列值的字段的总和

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

我希望得到同样的路线,这里的条件的总和表是我应该把AAA-ZZZ和ZZZ-AAA航线为一条路由。路线ZZZ-AAA只是从原来的目的地返回。

我想获得的结果是这样的:

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

任何建议,想法如何,我可以写我的SQL查询请来实现呢?

问候, 杰克

+1

请发表[MCVE],以便我们可以摆弄它。这意味着表的CREATE TABLE语句和INSERT INTO语句填充样本数据。 –

+0

这个必须返回一个现有的组合吗?即在你的例子中,只有'AAA,CCC','CCC,AAA'也是一个有效的结果呢?戈登的答案将会失败。 – dnoeth

+0

嗨dnoeth, 感谢您的评论。 CCC-AAA不是有效的结果,因为在这种情况下,原始表(源)中没有这样的路由组合。 – Jack84

回答

0

只需使用least()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

嗨戈登, 这对我来说是完美的工作,并解决我的问题。 非常感谢您的快速回复。 Regards, Jack – Jack84

1

如果你需要保存的列的顺序(即a,b但没有b,a必须返回现有的组合),则必须扩大戈登解决方案并为原始订单添加指标。

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; 

这可以进一步简化没有派生表,但然后它真的很难理解,它是相同的解释无论如何。

相关问题