首页 > 解决方案 > 查询以查找要聚合的不同字符串

问题描述

我有一个名为logoninfo. 下面是架构。

   Record ID|User ID | Computer ID |LOGON_TIME|LOGOFF_TIME

如果注销时间为 0,则用户当前已登录计算机。用户名在名为“user”的单独表中,带有模式

   user id  | user name 

计算机名称在名为“computer”的单独表中,带有架构

    computer id | computer name 

我需要一份报告,其中包含用户名及其对应的当前登录计算机(以逗号分隔)

        user name | computer names

我使用了以下查询,但在某些情况下会导致重复的计算机(同一台计算机显示不止一次)。

select user.name as USER_NAME,
    userLogon."comps" as COMPUTERS
from user
    inner join (
        select user_id as "user_resource",
            string_agg(compRes.name, ' ,') as "comps"
        from logoninfo
            inner join computer compRes on logoninfo.computer_id = compRes.computer_id
        where logoninfo.logoff_time = 0
        group by logoninfo.user_id
    ) userLogon on userLogon."user_resource" = user.user_id

所以我尝试添加distinct功能string_agg,但在 SQL Server 中是不可能的。

请帮我查询所需的报告。

提前致谢。

标签: sqlsql-serveraggregate-functionsdistinctstring-aggregation

解决方案


我是这样做的。你可以删除#标志,这意味着我使用了一个临时表。

SELECT u.name as [USER_NAME]
     , l.comps as [COMPUTERS]
FROM #user u
OUTER APPLY (
  SELECT STRING_AGG(c.name, ', ') as [comps]
  FROM (
    SELECT c.name
    FROM #logoninfo l
    JOIN #computer c ON l.computer_id = c.computer_id
    WHERE l.user_id = u.user_id
      AND l.logoff_time = 0
    GROUP BY c.name
  ) c
) l

结果是:

在此处输入图像描述


推荐阅读