2014-04-15 70 views
1

我有一个数据集包含的应用程序名称的(ApplicationAlias)和用户名,然后重复计数SQL汇总组单柱

用户希望报告卷起(这些应用程序前20名,但是添加的所有以前行的用户名计数(组合不同)

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

目前我只能想到使用集合运算符约20联合所有查询与串联如上所示,几乎不理想。

还有别的办法吗?

我使用SQL Server及其ApplicationAlias的单个表和用户名

但有在该作品的另一个扳手他们ONLY要计算有应用程序有问题的用户,即任何人不应包括在列表之外(即标准构建应用程序,Adobe Acrobat,Microsoft Office Word)。

我在想这在SQL中几乎是不可能的,或者至少只能用部分语句来完成从Excel的帮助下收集数据?

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

| UserName | ApplicationAlias |


| 10008 | Standard Build Apps |


| 10008 | Adob​​e Acrobat |


| 10056 | Microsoft Office Word |


| 10056 | Microsoft Office Excel |


| 10059 |赛门铁克PGP桌面|


+1

您使用的是哪个平台? Sql服务器有一个'PIVOT'方法可能适合你。 – paqogomez

+0

是使用SQL服务器 – Frazer

+0

请编辑您的问题以更好地解释您的表格结构。它听起来有两行,一个是应用程序名和用户数。那是对的吗? – paqogomez

回答

1

因此,鉴于您最近的编辑,它看​​起来像你想要两列,逗号分隔的应用程序列表和你的用户。

“标准构建应用程序,使用Adobe Acrobat”,10008

“Microsoft Office Word中,Microsoft Office Excel中”,10056

赛门铁克PGP桌面”,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子句。

+0

连接“客户注意事项,订单注释”等字段的很好的技巧。 –