SQL Rollup Group By Single Column

时间:2014-04-15 18:06:14

标签: sql sql-server

我有一个由ApplicationName(ApplicationAlias)组成的数据集,然后是UserName的不同计数

用户希望报告汇总(这些应用的前20个,但添加了所有先前行的用户名计数(组合不同)。

  • 标准版应用 - 6174
  • 标准构建应用程序,Adobe Acrobat - 6397
  • 标准构建应用程序,Adobe Acrobat,Microsoft Office Word - 6605
  • 标准构建应用程序,Adobe Acrobat,Microsoft Office Word,Microsoft Office Outlook - 6723
  • 标准构建应用程序,Adobe Acrobat,Microsoft Office Word,Microsoft Office Outlook,Microsoft Office Excel - 6859 -...(等等)

目前我只能想到使用一个带有大约20个联合的集合运算符,所有查询都具有如上所示的串联,几乎不理想。

还有其他办法吗?

我正在使用SQL Server及其ApplicationAlias和UserName的单表

但是还有另一个工具,因为他们 ONLY 想要计算有问题的应用程序的用户,即列表之外的任何其他用户(即标准构建应用程序,Adobe Acrobat,Microsoft Office)不应包括字。

我认为这在SQL中几乎是不可能的,或者至少只能通过部分语句在Excel的帮助下收集数据?

CREATE TABLE [dbo].[usersApps](
    [UserName] [varchar](100) NULL,
    [ApplicationAlias] [nvarchar](100) NULL
)

|用户名| ApplicationAlias |


| 10008 |标准构建应用程序|


| 10008 | Adob​​e Acrobat |


| 10056 | Microsoft Office Word |


| 10056 | Microsoft Office Excel |


| 10059 | Symantec PGP Desktop |


1 个答案:

答案 0 :(得分:1)

所以,鉴于您最近的编辑,看起来您想要两列,逗号分隔的应用列表和您的用户。

  

"标准构建应用程序,Adobe Acrobat",10008

     

" Microsoft Office Word,Microsoft Office Excel",10056

     

Symantec PGP Desktop",10059

如果要在sql中创建逗号分隔列表,可以执行FOR XML PATHSTUFF

SELECT apps = 
    STUFF((SELECT ', ' + ApplicationAlias
           FROM usersApps b  
           where b.UserName = a.UserName 
          FOR XML PATH('')), 1, 2, ''),
    UserName
FROM usersApps a
GROUP BY UserName

查看我的SQL Fiddle

如果要排除应用程序名称,只需添加where not in子句。