0

誰かがここで支援とアドバイスを貸してくれることを願っています。私はかなり複雑な結果を得ようとしていますが、サブクエリ、ユニオン、または単に個別のクエリを使用して 1 つのクエリとして実行できるかどうか、事後に Excel にマージできるかどうかはわかりません。

次のテーブルを使用して、前任者のレガシー データベースを使用しています。 : In_stock (Y/N), id, form_id)

次のような最終結果を得ようとしています。

| SubmittedForms | Unsubmitted Forms | Sector | State |
|-----------------------------------------------------|
|       10       |         5         |  Agr   |  UT   |
|       0        |         7         |  Chem  |  MT   |
|       2        |         1         |  Bio   |  OK   |
|       13       |         0         |  Chem  |  NM   |

私が得ている主な問題は、送信されたフォームはそれ以上の引数を必要とせず、単純なカウントですが、送信されていないフォームは Inventory.in_stock='Y' に依存していることです。送信されたフォームに対する私のクエリは次のとおりです。

SELECT COUNT(Forms.id) AS Submitted, Business.sector, Business.state
FROM Forms
JOIN Business ON Forms.business_id=Business.id
WHERE Forms.submitted='Y'
GROUP BY Business.state, Business.sector

残念ながら、未提出のフォーム番号を正しく計算できないようです。そのセクターの in_stock が Y である行の総数を返すだけです。

Submitted と Unsubmitted に対して個別のクエリを実行する方が簡単な場合は、最終結果には問題ありませんが、in_stock に Y のフラグが立てられた Unsubmitted フォームの正しい数を取得するための助けが必要です。また、COUNT DISTINCT を使用しようとしましたが、うまくいきません。長く、10分後も実行されていました。単一のクエリ オプションで想定できるもう 1 つの問題は、送信済みフォームまたは未送信フォームのいずれかで 0/null 値が発生する可能性です。

どんな助けでも大歓迎です!

4

1 に答える 1

0

1 つのオプション:

SELECT COUNT(CASE WHEN Forms.submitted = 'Y' THEN 1 END) SubmittedForms,
       COUNT
        ( CASE WHEN Forms.submitted = 'N'
                AND EXISTS ( SELECT 1
                               FROM Inventory
                              WHERE form_id = Forms.id
                                AND in_stock = 'Y'
                           )
               THEN 1
           END
        ) UnsubmittedForms,
       Business.sector Sector,
       Business.state State
  FROM Forms
 RIGHT
 OUTER
  JOIN Business 
    ON Forms.business_id = Business.id
 GROUP
    BY Business.sector,
       Business.state
;

パフォーマンスが向上する可能性のある別のオプション:

SELECT COUNT(CASE WHEN Forms.submitted = 'Y' THEN 1 END) SubmittedForms,
       COUNT(CASE WHEN Forms.submitted = 'N' THEN 1 END) UnsubmittedForms,
       Business.sector Sector,
       Business.state State
  FROM ( SELECT *
           FROM Forms
          WHERE submitted = 'Y'
             OR id IN ( SELECT DISTINCT form_id
                          FROM Inventory
                           AND in_stock = 'Y'
                      )
       ) Forms
 RIGHT
 OUTER
  JOIN Business 
    ON Forms.business_id = Business.id
 GROUP
    BY Business.sector,
       Business.state
;
于 2012-08-10T14:43:45.493 に答える