2012-09-19 31 views
1

我試圖選擇一些交通流量數據併爲不同的交通方向創建總和,並在60秒的時間段內進行分組。簡表如下(時間戳是Unix紀元):通過時間戳組合條件並有條件地求和不同的列

Timestamp  Source  Destination Count 
1    inside  outside   5 
2    inside  outside   6 
3    outside inside   7 
65    inside  inside   4 
66    inside  outside   6 
72    inside  outside   7 

當前查詢(它的鏟裝,但沒有關於任何方向)

SELECT sum(count) AS total FROM table GROUP BY round(timestamp/60) 

這讓我對每個總數60秒「水桶」狀

Count 
18 
10 
7 

現在,在這裏我迷路了(我可以在客戶端代碼做到這一點,但我還挺喜歡與SQL如果可能這樣做)。我想有一個內部調用的入口,每個內部的source和dest作爲外部,一個叫outbound的外部行,外部的source和inside作爲dest,以及一個叫inside的行,source和dest都在裏面。依然由60秒桶分組。即什麼,我想回去是:

Inbound Outbound Internal 
    7  11  0 
    0   6  4 
    0   7  0 

我的SQL foo是弱,我真的不知道從哪裏開始(我懷疑我需要一個子查詢,但我不知道如何構建它)。

回答

1

你應該真正能夠做一個支點:

SELECT SUM(count) AS total 
    , SUM(CASE 
       WHEN Source = 'outside' 
        AND Destination = 'inside' 
        THEN count -- Use 1 if you only want to count each row 
       ELSE 0 END) AS [Inbound] 
    , SUM(CASE 
       WHEN Source = 'inside' 
        AND Destination = 'outside' 
        THEN count 
       ELSE 0 END) AS [Outbound] 
    , SUM(CASE 
       WHEN Source = 'inside' 
        AND Destination = 'inside' 
        THEN count 
       ELSE 0 END) AS [Internal] 
FROM table 
GROUP BY round(timestamp/60) 
+1

'THEN 1'應該是'那麼count'? – MatBailie

+1

@Dems - 啊,它應該 - 我已經更新了我的答案。謝謝! –

2
SELECT 
    round(timestamp/60)    AS bucket, 
    SUM(
    CASE WHEN source = 'inside' AND destination = 'outside' 
     THEN count ELSE 0 
    END 
)        AS outbound, 
    SUM(
    CASE WHEN source = 'outside' AND destination = 'inside' 
     THEN count ELSE 0 
    END 
)        AS inbound, 
    SUM(
    CASE WHEN source = 'inside' AND destination = 'inside' 
     THEN count ELSE 0 
    END 
)        AS internal 
FROM 
    yourTable 
GROUP BY 
    round(timestamp/60) 
+0

when子句可以任意複雜嗎?即當1和10之間的源與11到20之間的dest時? – skarface

+1

@skarface - 是的,它可以 - 它只需要是一個表達式評估爲布爾值。請參閱http://www.sqlite.org/lang_expr.html#case –

+1

@skarface - 是的。這是'SUMIF()'的標準模式。它可以像你希望的那樣複雜,你甚至可以用不同的權重來處理不同的值...'SUM(如果a = b則計數當 b則計數/ 2否0 END)' – MatBailie