SQL Server 2008 R2中具有值计数的交叉表查询

SQL Server 2008 R2中具有值计数的交叉表查询,sql,sql-server,sql-server-2008-r2,pivot,Sql,Sql Server,Sql Server 2008 R2,Pivot,我已经搜索过了,但没有找到(或理解!)如何做我需要做的事情。我觉得问这个有点傻,因为还有其他的例子,但我就是不明白 以下是我在视图中看到的数据: [Approach Status] [Clinic] Approached GI Med Onc Pending GI Med Onc Approached GI Med Onc Not Approached Breast Med Onc Approached

我已经搜索过了,但没有找到(或理解!)如何做我需要做的事情。我觉得问这个有点傻,因为还有其他的例子,但我就是不明白

以下是我在视图中看到的数据:

[Approach Status] [Clinic]  
Approached         GI Med Onc  
Pending            GI Med Onc  
Approached         GI Med Onc  
Not Approached     Breast Med Onc  
Approached         Breast Med Onc  
我需要的是:

[Approach Status] [GI Med Onc] [Breast Med Onc]  
Approached           2            1  
Not Approached       0            1  
Pending              1            0  

我一直在修改我在这里找到的代码,但是。。。。感谢您的帮助

有几种不同的方法可以将行转换为列。一种方法是使用聚合函数和CASE表达式:

select ApproachStatus,
  sum(case when Clinic = 'GI Med Onc' then 1 else 0 end) [GI Med Onc],
  sum(case when Clinic = 'Breast Med Onc' then 1 else 0 end) [Breast Med Onc]
from yt
group by ApproachStatus;

或者,由于您使用的是SQL Server 2005+,因此可以使用PIVOT函数:

select ApproachStatus, [GI Med Onc],[Breast Med Onc]
from yt
pivot
(
  count(Clinic)
  for Clinic in ([GI Med Onc],[Breast Med Onc])
) piv;

如果您有一个未知的
Clinic
值,则需要使用动态SQL来获得结果:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Clinic) 
                    from yt
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ApproachStatus,' + @cols + ' 
            from yt
            pivot 
            (
                count(Clinic)
                for Clinic in (' + @cols + ')
            ) p '

execute(@query)
看。所有查询将给出一个结果:

| APPROACHSTATUS | GI MED ONC | BREAST MED ONC |
------------------------------------------------
|     Approached |          2 |              1 |
| Not Approached |          0 |              1 |
|        Pending |          1 |              0 |

谢谢第一个示例有效,但第二个(首选)返回:GI Med Onc Breast Med Onc APNECTED 1 0挂起1 0 APNECTED 1 0 Not APNECTED 0 1 APNECTED 01@ClintFinch你能编辑演示吗使用一些示例数据和正在使用的查询?奇数。。。。当我使用SQLFIDLE时,我得到了正确的值。。。。唯一不同的是,我的数据源是一个包含许多列的视图(不仅仅是我在这里引用的两列),而不是一个表,这是否重要@ClintFinch如果返回的列数多于透视所需的列数,则可以更改结果,因为这些列用于透视应用的分组中。如果我向多行添加一个具有不同值的列,然后尝试透视,结果将由于附加列而发生倾斜。您应该只包括需要在pivot.ok中显示的列,那么为什么它可以在sqlfiddle中工作,而不能在managementstudio中工作呢?这个例子包含了我需要的所有内容——为了简洁起见,我在我的帖子中删去了其他内容。这些是“临床”一栏中的不同值(只有前列腺尚未被记录-将被记录)未知的乳腺Med Onc耳鼻喉科Ourisman无临床数据GI Med Onc