SQL计数表中的唯一值

时间:2018-11-30 23:53:21

标签: sql

我正在使用SQL EXPRESS 2008。

我有一个表,可跟踪用户正在使用的所有操作系统。我想准确了解每个操作系统使用了多少用户。问题在于表中还有其他条目,因此每当更新这些条目时,它都会添加具有该用户的OS和ID的另一个条目。因此,如果我仅搜索1个用户,则返回的计数为66,但这不应该为1。如何通过唯一ID为每个操作系统返回计数值? [MAC Address ID]是用户的唯一ID,但是可以有许多具有该用户ID的条目。

我尝试了以下队列:

USE db1
SELECT Windows.[Windows Version], COUNT(Topology.[MAC Address ID])
FROM Topology
JOIN Windows ON Windows.[Windows Version ID] = Topology.[Windows Version ID]
WHERE Topology.[MAC Address ID] IN (28, 154)
GROUP BY Windows.[Windows Version], Topology.[MAC Address ID]

它返回

enter image description here

这是不对的,我的where子句仅搜索2个用户,因此我的总数应为2,而不是72。第1行应为1,第2行应为1。(理想情况是删除了我应该在where子句中查看使用每个操作系统的用户数。

这是我的拓扑表的样子:

enter image description here

基本上,我想删除WHERE子句,仅能绘制使用每个操作系统的用户数。

2 个答案:

答案 0 :(得分:0)

您可以使用子查询来简化拓扑表,并获得仅包含感兴趣信息的独特结果:

USE db1

  SELECT Windows.[Windows_Version], COUNT(simplifiedTopology.[MAC_Address _ID])
    FROM ( SELECT DISTINCT [MAC_Address_ID], [Windows_Version_ID] FROM Topology ) simplifiedTopology
    JOIN Windows ON Windows.[Windows_Version_ID] = simplifiedTopology.[Windows_Version_ID]
   WHERE simplifiedTopology.[MAC_Address_ID] IN (28, 154)
GROUP BY Windows.[Windows_Version], Topology.[MAC_Address_ID]

答案 1 :(得分:0)

在计数汇总函数中添加“与众不同”,在Windows上只需group by。[Windows版本]:

SELECT Windows.[Windows Version], COUNT(distinct Topology.[MAC Address ID])
FROM Topology
JOIN Windows ON Windows.[Windows Version ID] = Topology.[Windows Version ID]
WHERE Topology.[MAC Address ID] IN (28, 154)
GROUP BY Windows.[Windows Version]