2013-04-28 28 views
-3

在一天中的很长一段时间里,我一直在敲击键盘。我需要帮助!在Microsoft SQL查询中识别组的最佳方式

我有一个可能或可能不属于组织的客户列表。这些组织按组织类型分组。我试图在每个组的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

您可以使用SQL枢见下文

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

+0

有趣......这是否意味着你的东西的机构单位以逗号分隔的变量? @orgs =(org1,org2,org3)。我将不得不阅读关键点。从未听说过它。 – 2013-04-28 02:12:03

+0

是的,在'@ orgscolumns'中,我创建了所有'orgs'的动态列表,'@ orgs'的列有条件将值转换为Y,N。您可以通过将'exec(@query)'替换为'打印(@query)' – 2013-04-28 02:15:48