2

この質問が繰り返される可能性があることはわかっています...しかし、このようなクエリがあり、テーブルに「Compute_CRM_State」フィールドがあります。そのフィールドには「承認済み、保留中、キャンセル済み」などのデータが含まれていますが、承認済み、保留中、またはキャンセル済みの合計数を取得したいと思います。サブクエリで試してみました。承認済み、保留中、キャンセル済みの合計数を取得できますが、同じレコードを何度も取得しました。

クエリから得た結果。

クエリ:

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つだけ表示されるはずですが、テーブル内のレコードの数に含まれる回数が表示されます。

4

1 に答える 1

3

合計カウントを正しく取得せず、代わりに多くのレコードを取得しなかった理由は、COUNTsが相関サブクエリとして選択されているため、テーブル内の各レコードのカウントを取得するためです。

これを修正するには、相関するsubueryからではなく、外部クエリで集計関数を使用する必要があります。そして、各ステータスの合計数を取得するには、次のCASEように式を使用してこれを行います。

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;

SQLフィドルデモ


または:PIVOTテーブル演算子を使用して同じことを行うことができます:

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;

このように

于 2013-02-07T10:09:29.580 に答える