【问题标题】:Crosstab query with count of values in SQL Server 2008 R2带有 SQL Server 2008 R2 中值计数的交叉表查询
【发布时间】:2013-06-05 18:02:55
【问题描述】:

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

这是我在视图中的数据:

[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  

我已经修改了在这里找到的代码,但是......感谢任何帮助!

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2 pivot


    【解决方案1】:

    有几种不同的方法可以将行转换为列。一种方法是使用带有 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 with Demo

    或者由于您使用的是 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 with Demo

    如果您有一个未知的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 with Demo。所有查询都会给出结果:

    | 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
    • @ClintFinch 你能用你的一些示例数据和你正在使用的查询来编辑演示(sqlfiddle.com/#!3/ef8f0/3)吗?
    • Odd....当我使用 sqlfiddle 时,我得到了正确的值....唯一的区别是我的数据源是一个包含许多列的视图(不仅仅是两个我我在这里引用)而不是表格,这有关系吗? sqlfiddle.com/#!3/a4645/1/0
    • @ClintFinch 如果您返回的列多于透视所需的列,那么您可以更改结果,因为这些列用于透视应用的分组。如果我将具有不同值的列添加到多行,然后尝试进行透视,则结果将因附加列而倾斜。您应该只包括需要在数据透视表中显示的列。
    • 好的,那为什么它可以在 sqlfiddle 中工作而不是在 Management Studio 中呢?该示例确实包含了我需要的所有示例 - 为了在我的帖子中简洁起见,我删除了其他示例。这些是 Clinic 列中的不同值(仅前列腺尚未记录 - 将是) Unknown Breast Med Onc Otolaryngology Ourisman No Clinic Data GI Med Onc
    猜你喜欢
    • 2014-04-01
    • 2012-06-22
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多