2016-01-21 113 views
1

我知道在這個問題上有很多帖子,但沒有一篇似乎適用。所以我會盡量做到儘可能描述性。我試圖創建一個對象來計算它被查看,導出和評論的次數。在我看來,首先查詢必須找到對象,然後必須從Impala DB中提取計數記錄(行)。在SQL語句中對一個對象進行多次計數

它從2個系統之一'sys_a'或'sys_b'中檢索此信息。 所以在我的半僞代碼:

select object, sum(case when action = 'viewed' and (system = 'sys_a' or 'sys_b') then 1 else 0 end) viewCount, 
       sum(case when action = 'exported' and (system = 'sys_a' or 'sys_b') then 1 else 0 end) exportCount, 
       sum(case when action = 'commented' and (system = 'sys_a' or 'sys_b') then 1 else 0 end) commentCount 
from events; 

不幸的是,當我有重複的,出口在我events表,我知道我有對象,我的所有計數爲0

換句話說 - 我的目標3421AA2B已遠銷13倍,但它仍然具有0 計數我知道這是因爲,如果我做一個簡單的

select count(*) 
from events 
where object = '3421AA2B' and action = 'exported' and (system = 'sys_a' or system = 'sys_b'); 

我的計數顯示爲13.

+0

必須添加GROUP BY目的; –

+1

無法看到爲什麼重複記錄很重要。你不是分組,只是做一些基本的過濾。如果沒有別的,愚蠢只會增加計數,而不是零。並注意,由於您在所有sum(case語句)中執行了SAME sys_a/sys_b測試,因此您可以將sys_a/sys_b測試移到通用的where語句中。 –

+0

增加了group by,didn沒關係,我在''系統'附近移除了大括號,現在我正在正確地獲取'objects' – jiveturkey

回答

2

您在or statments忘記system = ...

select object, sum(case when action = 'viewed' and (system = 'sys_a' or system ='sys_b') then 1 else 0 end) viewCount, 
       sum(case when action = 'exported' and (system = 'sys_a' or system ='sys_b') then 1 else 0 end) exportCount, 
       sum(case when action = 'commented' and (system = 'sys_a' or system ='sys_b') then 1 else 0 end) commentCount from events; 

檢查情況報表輸出:

SELECT object, 
    case when action = 'viewed' then 1 else 0 end as view, 
    case when action = 'exported' then 1 else 0 end as export, 
    case when action = 'commented' then 1 else 0 end as comment 
FROM events 
WHERE system = 'sys_a' OR system = 'sys_b' 

我刪除喜歡馬克·B系形式case語句建議

+0

對不起,這只是一個錯字,它確實存在 – jiveturkey

+0

您是否嘗試輸出'case statements'? – Dionys

+0

不,我怎樣才能做到這一點?btw - SQL白癡 – jiveturkey

1

不知道爲什麼,但無論如何,我會嘗試添加

GROUP BY object; 

到您的查詢.. ,因爲沒有它,你會得到意想不到的效果。

只有在此修改後,您才能嘗試並理解下一步要解決的問題。