2017-07-26 95 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; 

這可以進一步簡化沒有派生表,但然後它真的很難理解,它是相同的解釋無論如何。

相關問題