SQL Server:盘点库存问题(带子查询)
我目前有一个查询,它将进入(服务器的)库存表,过滤哪些是“开发人员”,并从审计相关表中生成不同用户的列表。基本上,试图找出谁可以访问这个特定清单中的开发服务器 在我添加第二行之前,一切正常,我在下面的代码中注释掉了第二行:SQL Server:盘点库存问题(带子查询),sql,sql-server,database,subquery,reporting,Sql,Sql Server,Database,Subquery,Reporting,我目前有一个查询,它将进入(服务器的)库存表,过滤哪些是“开发人员”,并从审计相关表中生成不同用户的列表。基本上,试图找出谁可以访问这个特定清单中的开发服务器 在我添加第二行之前,一切正常,我在下面的代码中注释掉了第二行: select distinct tAudit.[USER_ID] --, count(tAudit.[USER_ID]) AS [USER_COUNT] from table_audit as tAudit where tAudit.inst_name IN
select distinct tAudit.[USER_ID]
--, count(tAudit.[USER_ID]) AS [USER_COUNT]
from table_audit as tAudit
where tAudit.inst_name IN (
SELECT (SUBSTRING([Computer Name],0,CHARINDEX('.',[Computer Name],0))) AS INST_NAME
FROM table_server_inventory
WHERE [SQL Server Edition] = 'Developer'
)
order by tAudit.user_id asc
所以,问题是:我如何计算某个特定用户出现的次数?与我使用的distinct有冲突吗?我提出了另一个问题,纯粹是想看看我是否走上了正确的道路。这是一个例子:
select tAudit.[USER_ID]
, count(tAudit.[USER_ID]) AS [USER_COUNT]
from table_audit as tAudit
where tAudit.user_id IN ('user_001', 'user_009', 'user_199', 'user_222')
group by tAudit.user_id
看起来是这样的:
USER_ID USER_COUNT
user_001 5
user_009 32
user_199 14
user_222 8
理想情况下,当主查询工作时,它将与上面的示例类似,只是有几十个以上的结果
注意:表_audit实际上非常大,每次都列出服务器和用户。例如:
COMPUTER_NAME USER_ID
serverAA user_001
serverAA user_009
serverAA user_199
serverAA user_222
serverBB user_001
serverBB user_009
serverCC user_001
serverCC user_199
serverCC user_222
您只需要一个
分组依据
查询,而不是选择不同的
:
select tAudit.[USER_ID], count(tAudit.[USER_ID]) AS [USER_COUNT]
from table_audit as tAudit
where tAudit.inst_name IN (
SELECT (SUBSTRING([Computer Name],0,CHARINDEX('.',[Computer Name],0))) AS INST_NAME
FROM table_server_inventory
WHERE [SQL Server Edition] = 'Developer'
)
group by tAudit.[USER_ID]
order by tAudit.user_id asc
您只需要一个
分组依据
查询,而不是选择不同的
:
select tAudit.[USER_ID], count(tAudit.[USER_ID]) AS [USER_COUNT]
from table_audit as tAudit
where tAudit.inst_name IN (
SELECT (SUBSTRING([Computer Name],0,CHARINDEX('.',[Computer Name],0))) AS INST_NAME
FROM table_server_inventory
WHERE [SQL Server Edition] = 'Developer'
)
group by tAudit.[USER_ID]
order by tAudit.user_id asc
你的第二个问题是正确的。COUNT是一个聚合函数,需要第一个查询中缺少的GROUP BY子句。我已尝试在第一个查询中添加GROUP BY子句,我的逻辑和位置必须为off。我只想像在第二个查询中那样手动列出所有用户,但是有将近200个。此外,该列表有点动态——可能在一周内发生变化。GROUP BY在WHERE之后和ORDER BY之前。你能用你尝试过的分组发布第一个查询吗?仅供参考,你可以把
DISTINCT
看作是一个退化/简化的分组。这是一条没有所有功能的捷径。令人钦佩的是,我将参考下面Gordon Linoff的回答,因为他拿出了DISTINCT,并让我在ORDER BY和before WHERE之前加入GROUP BY。但是,正如我在那里提到的,它包括用户出现在表中的总次数。我正在寻找的计数只为开发人员服务器。我有一个用户返回,可以访问1804台服务器,这。。。超过了开发人员服务器的数量。哎呀!你的第二个问题是正确的。COUNT是一个聚合函数,需要第一个查询中缺少的GROUP BY子句。我已尝试在第一个查询中添加GROUP BY子句,我的逻辑和位置必须为off。我只想像在第二个查询中那样手动列出所有用户,但是有将近200个。此外,该列表有点动态——可能在一周内发生变化。GROUP BY在WHERE之后和ORDER BY之前。你能用你尝试过的分组发布第一个查询吗?仅供参考,你可以把DISTINCT
看作是一个退化/简化的分组。这是一条没有所有功能的捷径。令人钦佩的是,我将参考下面Gordon Linoff的回答,因为他拿出了DISTINCT,并让我在ORDER BY和before WHERE之前加入GROUP BY。但是,正如我在那里提到的,它包括用户出现在表中的总次数。我正在寻找的计数只为开发人员服务器。我有一个用户返回,可以访问1804台服务器,这。。。超过了开发人员服务器的数量。哎呀!这是在正确的轨道上!您提到的分组方式和不使用SELECT DISTINCT是有道理的。但是,为[USER_COUNT]提取的数字是该特定用户在表_audit total中出现的次数,而不是仅为“开发者”结果出现的次数。如何针对特定情况修改此选项?@Erik。由于where
子句,这应该只计算用户标记为开发人员的行。这是正确的!您提到的分组方式和不使用SELECT DISTINCT是有道理的。但是,为[USER_COUNT]提取的数字是该特定用户在表_audit total中出现的次数,而不是仅为“开发者”结果出现的次数。如何针对特定情况修改此选项?@Erik。由于where
子句,这应该只计算将用户标记为开发人员的行。