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

4

我已经搜索但无法找到(或理解!)如何做我需要做的事情。因为有其他示例,所以我觉得有点傻问这个问题,但我就是不明白....

以下是我在视图中拥有的数据:

[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  

我尝试修改在这里找到的代码,但是……需要帮助!

1个回答

3

您可以通过使用带有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 Fiddle

如果您使用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;

请查看带有演示的 SQL Fiddle

如果您有未知的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)

请查看带演示的SQL Fiddle:http://sqlfiddle.com/#!3/ef8f0/6。所有查询都将得到结果:
| APPROACHSTATUS | GI MED ONC | BREAST MED ONC |
------------------------------------------------
|     Approached |          2 |              1 |
| Not Approached |          0 |              1 |
|        Pending |          1 |              0 |

谢谢。第一个例子可行,但第二个(首选)返回以下内容: GI Med Onc Breast Med Onc Approached 1 0
Pending 1 0
Approached 1 0
Not Approached 0 1
Approached 0 1
- Clint Finch
如果您在透视表中返回的列超过所需列,则会更改结果,因为这些列用于分组透视应用。 如果我向多行添加具有唯一值的列,然后尝试进行透视,结果将会偏斜,因为有额外的列。 您应该只包含在透视表中需要显示的列。 - Taryn
好的,那么为什么它在sqlfiddle中可以工作而在Management Studio中不能?示例确实包括我需要的所有内容 - 我已经编辑了其他内容以简化我的帖子。这些是Clinic列中的不同值(只有前列腺尚未记录 - 将被记录)未知 乳腺医学肿瘤科 耳鼻喉科 Ourisman 没有诊所数据 GI Med Onc - Clint Finch
搞定了!非常感谢,我会为每个创建单独的视图。你真是帮了大忙! - Clint Finch
+1 帮助我解决了类似的问题。@ClintFinch 你应该将其标记为答案。 - YvesR
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接