(警告,我是一个Java人,而不是一个SQL人......)试图在SQL中做一些令我困惑的事情......
简化示例:我有一个ACTIVE_USERS
表(其中USER_ID
和ACTIVE_DATE
已成为活动状态。有一个USERS
表(对于他们所属的群组,ID
,USERNAME
和GROUP_ID
。还有一个USERGROUP
表格(ID
和GROUP_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作为参数传递?
答案 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