2

次の表に基づいてレポートを生成する必要があります。

CALLS_FOR_PROPOSALS

ID|Name 
--+------
 1|Call 1
 2|Call 2
 3|Call 3


PROPOSALS

ID|Call ID|Title
--+-------+----------
 1|      1|Proposal 1
 2|      2|Proposal 2
 3|      2|Proposal 3


PROPOSAL_STATUSES

ID|Proposal ID|Status ID
--+-----------+---------
 1|          1|        1
 2|          2|        1
 3|          3|        1
 4|          3|        2


STATUSES

ID|NAME
--+------------
 1|Not Reviewed
 2|Processing
 3|Accepted
 4|Rejected

このサンプルデータでは、3つの提案の呼び出しがあります。3つの提案があります。1つはコール1用、2つはコール2用です(コール3にはプロポーザルはありません)。各プロポーザルには、少なくとも1つのステータスが割り当てられています。行がPROPOSALSテーブルに挿入されると、対応する行がPROPOSAL_STATUSESに挿入され、プロポーザルの初期デフォルトステータスが1(未レビュー)になります。ステータスが変更されるたびに、新しい行がPROPOSAL_STATUSESテーブルに挿入されるため、ステータス変更の履歴が保持されます。コールごとに、送信されたプロポーザルの数、および複数のステータスを持つ(つまり、ステータスがデフォルトから少なくとも1回変更された)プロポーザルの数を示すレポートを生成する必要があります。上記のサンプルデータの場合、結果は次のようになります。

Call Name|Proposals Submitted|Proposals Reviewed|
---------+-------------------+------------------+
Call 1   |                  1|                 0|
Call 2   |                  2|                 1|
Call 3   |                  0|                 0|

上記のテーブル構造に基づいてこのレポートを生成するSQLクエリをどのように記述しますか?ご協力いただきありがとうございます。

4

1 に答える 1

2

そのようなものがトリックを行う必要があります:デモ

  SELECT Name as 'Call name', 
         submitted as 'Proposals Submitted',
         SUM(CASE WHEN maxStatus > 1 THEN 1 ELSE 0 END) as 'Proposals Reviewed'
FROM
   (SELECT cfp.Name, 
    sum(case when ps.Status_ID = 1 then 1 else 0 end) as submitted,
    MAX(ps.Status_ID) as maxStatus
    FROM CALLS_FOR_PROPOSALS cfp
    LEFT JOIN PROPOSALS p on cfp.ID = p.CALL_ID
    LEFT JOIN PROPOSAL_STATUSES ps on ps.PROPOSAL_ID = p.ID
    GROUP BY cfp.Name) AS s

GROUP BY Name, submitted
于 2012-10-24T15:33:50.617 に答える