首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在sql server 2008中使用子查询?

如何在sql server 2008中使用子查询?
EN

Stack Overflow用户
提问于 2013-02-07 18:06:54
回答 1查看 13.4K关注 0票数 2

我知道这个问题可能会重复..。但是我有这样的查询,我的表中有一个字段"Compute_CRM_State“。该字段包含“已批准、待处理、已取消”之类的数据,但现在我想获取已批准、待处理或已取消的总数。我试着用子查询。我可以获得已批准、待处理或取消的总计数,但是..我多次得到相同的记录。

查询:

代码语言:javascript
复制
SELECT        (SELECT        COUNT(Compute_CRM_State) AS Expr1
                          FROM            CRM_Doctor_Request
                          WHERE        (CRM_State_Id = 1)) AS PENDING,
                             (SELECT        COUNT(Compute_CRM_State) AS Expr2
                               FROM            CRM_Doctor_Request AS CRM_Doctor_Request_3
                               WHERE        (CRM_State_Id = 2)) AS Approved,
                             (SELECT        COUNT(Compute_CRM_State) AS Expr3
                               FROM            CRM_Doctor_Request AS CRM_Doctor_Request_2
                               WHERE        (CRM_State_Id = 3)) AS CANCELLED
FROM            CRM_Doctor_Request AS CRM_Doctor_Request_1

应仅显示1条计数记录。但它显示的是表中记录数量包含的次数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-07 18:09:30

您没有正确地获取总计数而是获取了许多记录的原因是,COUNT被选为相关子查询,因此您将获得表中每条记录的计数。

要解决这个问题,必须在外部查询中使用聚合函数,而不是在相关子查询中。要获得每个状态的总计数,请使用CASE表达式,如下所示:

代码语言:javascript
复制
SELECT
  SUM(CASE WHEN CRM_State_Id = 1 THEN 1 ELSE 0 END) AS PENDING,
  SUM(CASE WHEN CRM_State_Id = 2 THEN 1 ELSE 0 END) AS Approved,
  SUM(CASE WHEN CRM_State_Id = 3 THEN 1 ELSE 0 END) AS CANCELLED
FROM  CRM_Doctor_Request;

或:您可以使用PIVOT表运算符执行相同的操作:

代码语言:javascript
复制
SELECT 
  [1] AS PENDING, 
  [2] AS Approved, 
  [3] AS Cancelled
FROM 
( 
   SELECT * FROM CRM_Doctor_Request
) AS t
PIVOT
(
  COUNT(Compute_CRM_State)
  FOR  CRM_State_Id IN([1], [2], [3])
) AS p;

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14748401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档