SQL 计数列和列表值

Mar*_* B. 5 sql sql-server count

我正在尝试创建一个查询,该查询将输出列的计数,然后列出它计数的名称:

表1:license_granted

users      checkout  
Bob        2014-11-18 01:00:00  
Steve      2014-11-18 01:00:00
Bob        2014-11-18 01:30:00
Chris      2014-11-18 01:30:00
Run Code Online (Sandbox Code Playgroud)

我能够计算并得到以下输出:

checkout_time            ctUsers  
2014-11-18 01:00:00         2
2014-11-18 01:30:00         2

SELECT COUNT(DISTINCT users) AS ctUsers, checkout
FROM license_granted
GROUP BY checkout 
Run Code Online (Sandbox Code Playgroud)

我想得到的是:

checkout_time            ctUsers     userlist
2014-11-18 01:00:00         2        Bob,Steve
2014-11-18 01:30:00         2        Bob,Chris
Run Code Online (Sandbox Code Playgroud)

这可以在查询中完成吗?

谢谢

更新 11/20 好吧,我进一步挖掘并找到了一个解决方案,可以为我提供结帐时间和用户列表。现在我想弄清楚如何计算用户列表中的元素:

SELECT a.ctDate, SUBSTRING(d.users,1, LEN(d.users) - 1) usersList, count(d.users) AS ctUsers
FROM  (
   SELECT DISTINCT convert(varchar(10), deniedTime, 126) AS ctDate
    FROM hyperworks_checkouts
    ) a
    CROSS APPLY
    (
        SELECT DISTINCT [username] + ', ' 
        FROM hyperworks_checkouts AS B 
        WHERE A.ctdate = convert(varchar(10), deniedTime, 126)
        FOR XML PATH('')
    ) d (users)
Run Code Online (Sandbox Code Playgroud)

现在的输出如下所示:

ctDate        usersList
2014-01-15    Bob
2014-01-16    Steve,Bob
2014-01-17    Mike,Chris,Jerry
Run Code Online (Sandbox Code Playgroud)

如果我尝试在 Select 中添加 COUNT(d.users),我每次都会得到 1 的计数,因为只有一个列表。如何统计d.users中的用户数?

谢谢

Chu*_*uck 1

我认为GROUP_CONCAT函数就是您正在寻找的。

因此,对于您的示例,请尝试:

SELECT COUNT(DISTINCT users) AS ctUsers, checkout, GROUP_CONCAT(DISTINCT users)
FROM license_granted
GROUP BY checkout
Run Code Online (Sandbox Code Playgroud)

您还可以通过在 GROUP_CONCAT 查询中GROUP_CONCAT添加子句来定义值的自定义分隔符,即SEPARATORGROUP_CONCAT(DISTINCT users SEPARATOR ' '