在Microsoft SQL查询中识别组的最佳方法

时间:2013-04-28 00:21:31

标签: sql sql-server-2008

在一天的大部分时间里,我一直在敲击键盘。我需要帮助!

我有一个可能属于或可能不属于组织的客户列表。这些组织按组织类型分组。我试图在Excel中为每个组删除报告。每组组织都分配有随机数量的组织。在Excel工作表中,我需要在列中列出组中的每个组织,然后将客户端转储到相应列中带有Y或N的每一行。

我的源表如下所示:

GROUP    ORGID    CLIENT
1        1        5
1        2        4
1        1        4
1        3        5

Excel表格应如下所示:

ORGNAME1     ORGNAME2     ORGNAME3      CLIENT
Y            Y            N             4
Y            N            Y             5

Excel报告由C#Windows服务生成。我可以在为每个组执行之前构建查询,或者更喜欢以SQL方式执行我可以作为存储过程运行的查询,并只提供组织组ID。

编辑:如果我忘记提及它......每组将有一个Excel文档。每组可以包含2-10个组织,因此它必须是动态的。

有推荐的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用SQL pivot参见下文

declare @orgscolumns nvarchar(max)
declare @orgs nvarchar(max)
declare @query nvarchar(max)

select @orgscolumns = STUFF((SELECT distinct ',' + QUOTENAME(orgname) 
            FROM orgs
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')

select @orgs = STUFF((SELECT distinct ',case when ' + QUOTENAME(orgname) 
                     + ' is null then ''N'' Else ''Y'' END ' + QUOTENAME(orgname)
            FROM orgs
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')


select @query = 'select client, ' + @orgs + ' from
              ( select t.*, orgname from t inner join orgs o on t.orgid = o.id) v
              pivot ( max(orgid) for orgname in (' + @orgscolumns + ')) p'

exec(@query)

SQL DEMO