当前位置: 首页 > 面试题库 >

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

蒙经纶
2023-03-14
问题内容

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

这是我认为的数据:

[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 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。所有查询都会给出结果:

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


 类似资料:
  • 问题内容: 我有一个产生以下结果集的视图: 我需要将其转换为: 我只使用交叉表使用列,就知道该怎么做。如何在目标结果集中使用和产生新列?如果我只是在查询中添加列,它会抱怨“无效的源数据SQL语句”。 我正在使用PostgreSQL 9.3.6。 问题答案: 一种方法是使用复合类型: 或者,为临时使用(在会话期间注册类型): 然后,根据需要运行交叉表并分解复合类型: 所有括号都是 必需的 ! 基础知

  • 问题内容: 我在SQL Server中使用交叉表查询时遇到问题。 假设我有以下数据: 我想查询显示结果如下: 我如何查询以显示这样的输出? 笔记: 主题名称: C C ++ 英语 数据库 数学 将根据学生学习的学科而有所不同。 请访问http://sqlfiddle.com/#!6/2ba07/1来测试此查询。 问题答案: 有两种方法可以执行对值进行硬编码的静态方法和执行时确定列的动态方法。 即使

  • 问题内容: 我希望有人曾经尝试过这种方法,在我进一步尝试之前可以得到一些建议。 我希望产生类似于sql-server 2000中的交叉表查询的内容。 我有一个类似于以下内容的表结构: 我想做的是通过查询/存储过程来整理数据,以使构建报告更容易。 理想的解决方案将产生如下结果: 问题答案: 我最终使用存储过程(http://www.sqlteam.com/article/dynamic-cross-

  • 问题内容: 基于Access中的以下SQL … …我的结果返回了以下数据表: 除了 我想在为空的单元格中看到零 之外, 这个结果正是我想要的。 有什么选择呢?如果可能的话,我想避免使用子查询。我也希望查询在Access的“设计视图”中保持可编辑状态。 问题答案: 我认为您必须使用Nz函数,该函数将允许您将NULL转换为另一个值。在这种情况下,我用函数的(可选)部分说:“如果Sum([Shape_L

  • 问题内容: 说我有一个像这样的数组: 如何计算具有给定值的数字(在示例中为空白)? 而且有效吗?(大约十二个数组,每个数组包含数百个元素)此示例超时(超过30秒): 在这种情况下,空白元素的数量为3。 问题答案: 如何使用array_count _values来获得一个为您计算一切的数组?

  • 问题内容: 问题1: 我有一个具有以下结构和数据的表: 我想以以下格式显示这些记录: 我知道我需要使用交叉表/数据透视查询来获得此显示。为此,我基于对它的有限知识对其进行了尝试。以下是我的查询: 根据此查询,我得到以下显示: 任何人都可以帮助我对查询进行适当的更改以获取单行而不是如上所述的多行记录。 问题2: 还有一种方法可以获取特定字段的值作为列的名称。正如你可以在上面看到我有,,…作为标题。取