2016-01-21 114 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; 

到您的查询.. ,因为没有它,你会得到意想不到的效果。

只有在此修改后,您才能尝试并理解下一步要解决的问题。