-3

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

我有一份可能属于或不属于组织的客户列表。这些组织按组织类型分组。我正在尝试在 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 个组织,因此它必须是动态的。

有推荐的方法吗?

4

1 回答 1

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 演示

于 2013-04-28T01:19:16.680 回答