如何计算 Oracle 中表中的不同值

Sur*_*ya 5 oracle oracle11g

我有一个表结构如下:

ID            USER              STATE
---           ---               ---
1             U1                CA 
2             U1                VA
3             U2                CT
4             U3                AZ
5             U2                CT
Run Code Online (Sandbox Code Playgroud)

该查询预计会获取所有用户并统计他们访问过的州,并打印访问过超过或等于 1 个州的用户。

我基本上试图进行一个查询来给我这个输出:

U1    2
Run Code Online (Sandbox Code Playgroud)

关于如何构造此查询有什么想法吗?

我已经尝试过以下方法,但我陷入了困境。

SELECT DISTINCT(USER) 
FROM (SELECT DISTINCT(STATE) AS ST , USER 
FROM TEMP_TABLE) 
WHERE count(STATE) > 1;
Run Code Online (Sandbox Code Playgroud)

Chr*_*Hep 6

这就是 HAVING 子句的用途:过滤聚合数据。

SELECT user
      ,COUNT(DISTINCT state)
  FROM temp_table
 GROUP BY user
HAVING COUNT(DISTINCT state) > 1;
Run Code Online (Sandbox Code Playgroud)

如果 HAVING 子句让您感到不舒服,那么您可以按照您所展示的那样执行此嵌套查询,只需稍加调整即可。

SELECT user
  FROM (SELECT user
              ,COUNT(DISTINCT state) AS state_cnt
          FROM temp_table
         GROUP BY user) t
 WHERE state_cnt > 1;
Run Code Online (Sandbox Code Playgroud)

无论哪种情况,您都可以按用户分组并对状态进行计数,以获得“每个用户的状态”的答案。