首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL计数列和列表值计数

SQL计数列和列表值计数
EN

Stack Overflow用户
提问于 2014-11-20 06:01:32
回答 3查看 8.6K关注 0票数 3

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

表1: license_granted

代码语言:javascript
复制
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

我能够进行计数并获得以下输出:

代码语言:javascript
复制
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 

我想要得到的是:

代码语言:javascript
复制
checkout_time            ctUsers     userlist
2014-11-18 01:00:00         2        Bob,Steve
2014-11-18 01:30:00         2        Bob,Chris

这可以在查询中完成吗?

谢谢

更新11/20好的,我进一步挖掘了一下,找到了一个解决方案,可以给我结账时间和用户列表。现在我正在尝试弄清楚如何计算用户列表中的元素:

代码语言:javascript
复制
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)

输出现在如下所示:

代码语言:javascript
复制
ctDate        usersList
2014-01-15    Bob
2014-01-16    Steve,Bob
2014-01-17    Mike,Chris,Jerry

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

谢谢

EN

回答 3

Stack Overflow用户

发布于 2014-11-20 06:04:26

我认为GROUP_CONCAT函数就是您要找的。

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

代码语言:javascript
复制
SELECT COUNT(DISTINCT users) AS ctUsers, checkout, GROUP_CONCAT(DISTINCT users)
FROM license_granted
GROUP BY checkout

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-21 04:40:09

我找到了一个解决方案。在看了一些帖子之后,我能够拼凑出我需要的解决方案:

代码语言:javascript
复制
SELECT a.ctDate, SUBSTRING(d.users,1, LEN(d.users) - 1) usersList, 
    (select len(d.users) - len(replace(d.users, ',', ''))) AS ctUsers
FROM  (SELECT DISTINCT convert(varchar(10), deniedTime, 126) AS ctDate
    FROM hyperworks_denials
    ) a
    CROSS APPLY
    (
        SELECT DISTINCT [username] + ', ' 
        FROM hyperworks_denials AS B 
        WHERE A.ctdate = convert(varchar(10), deniedTime, 126)
        FOR XML PATH('')
    ) d (users) 

感谢所有给出建议的人

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 12:13:23

请尝试以下查询:

代码语言:javascript
复制
SELECT COUNT(DISTINCT users) AS ctUsers, checkout,to_char(wm_concat(users)) Name
FROM license_granted
GROUP BY checkout 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27027875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档