2017-07-06 47 views
0

说我有一个表,如下所示:SQL COUNT DISTINCT用于在MS Access每个ID

id category  app 
------------------------ 
1 game   angry birds 
1 game   happy dogs 
2 productivity calculator 
3 health   fitness tracker 
1 game   angry birds 
2 game   snake 

该表显示每个用户打开一段时间的应用程序。例如,假设您每次在手机上打开应用时都记下了这些内容。现在为100人重复这一点。如上所述,所有这些数据都存储在一个表中。

我想弄清楚如何计算每个人在特定类别内使用多少个不同的应用程序。例如,对于“游戏”类别,我希望:

id num_apps 
------------ 
1 2 
2 1 
3 0 

我明白,一个人不能使用COUNT在MS-访问(DISTINCT ..),并已经看到如何实现这个其他职位 - 我尽管如此,仍然无法将其应用于这种情况。

我曾尝试以下,我相信给我的是如何在一个特定类别使用过的每个应用程序的人非重复计数:

SELECT COUNT(*) 
FROM 
(SELECT DISTINCT id AS gamer_id 
FROM UseList 
WHERE category = 'game') 
AS b, UseList AS ul 
WHERE b.gamer_id = ul.id AND category = 'game' 
GROUP BY b.gamer_id; 

我怎么能适用于不同的搜索呢?我想过以各种方式遍历每个gamer_id,但这似乎并不太直接。 谢谢!

+0

从WHERE删除游戏条件。相反,做条件聚合。 – jarlh

+0

您的表格有一些列,但查询使用其他列。 – jarlh

+0

@jarlh哪些列是不同的?不知道如何做条件聚合,但会查找它,谢谢 – Windmill

回答

0

你可以使用

select t.id, count(*) 
    from (
    select distinct id, app 
    from UseList 
    where categorty ='game') t 

    group by t.id 
+0

这似乎已经做了伎俩 - 谢谢你!很简单,不知道我是如何错过的。 (不幸的是,MS Access不允许使用COUNT(DISTINCT app)) – Windmill

+0

@Windmill谢谢...然后从我的答案中删除count(不同的应用程序)部分.. – scaisEdge

0

我不知道我的理解,但你可以试试这个?

SELECT A.ID, A.CATEGORY , COUNT(APP) AS NUM_APPS 
FROM 
(SELECT A1.ID, A2.CATEGORY 
FROM (SELECT DISTINCT ID FROM TG1) A1 
     CROSS JOIN (SELECT DISTINCT CATEGORY FROM TG1) A2 
) A 
LEFT JOIN (SELECT DISTINCT ID, CATEGORY, APP 
      FROM TG1) B ON A.ID=B.ID AND A.CATEGORY=B.CATEGORY 
GROUP BY A.ID, A.CATEGORY 
+0

已经设法使用上一个答案解决此问题,但感谢这! – Windmill