如何获取SQL中的记录计数列表?

时间:2017-01-11 21:12:27

标签: sql

(警告,我是一个Java人,而不是一个SQL人......)试图在SQL中做一些令我困惑的事情......

简化示例:我有一个ACTIVE_USERS表(其中USER_IDACTIVE_DATE已成为活动状态。有一个USERS表(对于他们所属的群组,IDUSERNAMEGROUP_ID。还有一个USERGROUP表格(IDGROUP_NAME)。

我希望得到一个包含每个组中用户数量的组列表(对于给定的日期范围)。

到目前为止我所拥有的:

select distinct USER_ID, USERNAME, GROUP_NAME
from ACTIVE_USERS
INNER JOIN USERS 
ON ACTIVE_USERS.USER_ID=USER.ID
INNER JOIN USERGROUP
ON USER.GROUP_ID=GROUP.ID
where 
ACTIVE_USER.ACTIVE_TIME BETWEEN TO_DATE('2016-DEC-01', 'YYYY-MON-DD') AND TO_DATE('2017-JAN-01', 'YYYY-MON-DD')
AND
USERGROUP.ID=3006648

这为我提供了特定USERGROUP(3006648)的不同用户列表。

如果我将第一行更改为:

select count(distinct USER_ID) ...

这让我得到了重视。

不确定接下来要做什么...我是否将此代码转换为函数或其他内容并将我的日期和组ID作为参数传递?

1 个答案:

答案 0 :(得分:3)

您需要惊人的 SQL GROUP BY操作。

SELECT COUNT(DISTINCT USER_ID) User_count, GROUP_NAME
  ... the rest of your query .... leaving out WHERE GROUP.ID=3006648 ...
  GROUP BY GROUP_NAME

顺便说一句,这一行

  /*wrong*/   ACTIVE_USER.ACTIVE_TIME BETWEEN TO_DATE('2016-DEC-01', 'YYYY-MON-DD') AND TO_DATE('2017-JAN-01', 'YYYY-MON-DD')

包含一个臭名昭着的一个错误。 BETWEEN对日期时间比赛不利,因为它具有包容性。你真的希望这能在12月得到一切。

    ACTIVE_USER.ACTIVE_TIME >= TO_DATE('2016-DEC-01', 'YYYY-MON-DD') 
AND ACTIVE_USER.ACTIVE_TIME <  TO_DATE('2017-JAN-01', 'YYYY-MON-DD')

这会选择2016-12-31 23:59.59并拒绝2017-01-01 00:00:00