1

複雑な SQL ステートメントは初めてなので、助けが必要です。結果セットの半分を表示することができ、残りに苦労しています。

必要な結果:

PSU |  pregnancy number| pregnancy percentage | % of live birth out of the pregnancy number.
1   |          2       |          67%         |         40%
2   |          1       |          33%         |         80%

以下に記述されたSQLを使用して、最初の3列を取得できました。

2 列目と 3 列目は、 の where ステートメントが必要でしfieldname = 'Q111'た。4 番目の列には、where ステートメントでパーセンテージが必要ですfieldname = 'Q112。異なる where ステートメントを組み合わせるにはどうすればよいですか。

SELECT sms_psu.name1 AS PSU,
       woman_data.answertext  AS NumberOfPreg,
       Count(woman_data.answertext) / (SELECT Count(woman_data.answertext)
                                       FROM   woman_data
                                              INNER JOIN sms_household
                                                      ON woman_data.prim_key =
                                                         ms_household.hhid
                                              INNER JOIN sms_psu
                                                      ON sms_psu.psu =
                                                         sms_household.psu
                                       WHERE  sms_psu.state = 19
                                              AND sms_psu.district = 1
                                              AND sms_psu.psu = 2
                                              AND fieldname = 'Q139') AS
       totalcpuntpreg
FROM   woman_data
       INNER JOIN sms_household
               ON woman_data.prim_key = sms_household.hhid
       INNER JOIN sms_psu
               ON sms_psu.psu = sms_household.psu
WHERE  sms_psu.state = 19
       AND sms_psu.district = 1
       AND sms_psu.psu = 2
       AND fieldname = 'Q111'
GROUP  BY woman_data.answertext,
          sms_household.psu  

ゴードン、あなたの提案は私を大いに助けました.それに応じてクエリを更新しました.私が今書いている問題は、Q112の追加の行を取得していることです.

電源ユニット | 妊娠数| 妊娠率 | 妊娠数のうち出生率。
1 | 2 | 67% | 40%
2 | 1 | 33% | 80%
2 | 1 | 0% | 20% (3 行目は Q112 に追加)

ただし、グループ化を行っている間は Q112 エントリは必要ありません。group by を case ステートメントと main where ステートメントで別々に使用できますか? group by で「having」を使用してみましたが、期待どおりの結果が得られません。

4

3 に答える 3

1

多分このようなもの:

SELECT sms_psu.name1 AS PSU,
       woman_data.answertext  AS NumberOfPreg,
       SUM(fieldname = 'Q111') / SUM(fieldname = 'Q139') AS pregnancyPercentage,
       SUM(fieldname = 'Q112') / SUM(fieldname = 'Q139') AS liveBirthPercentage
FROM   woman_data
       INNER JOIN sms_household
               ON woman_data.prim_key = sms_household.hhid
       INNER JOIN sms_psu
               ON sms_psu.psu = sms_household.psu
WHERE  sms_psu.state = 19
       AND sms_psu.district = 1
       AND sms_psu.psu = 2
GROUP  BY woman_data.answertext,
          sms_household.psu  
HAVING SUM(fieldname = 'Q111') > 0

クエリは最初にすべてのfieldname値を持つ行を取得し、以前と同じようにグループ化します。カウントするときは、必要に応じて (トリックを使用して)特定のfieldnameエントリのみがカウントされます。SUM(condition)を含む行を持つグループのみが出力に含まれるようにするためfieldname = 'Q111'に、SUM(fieldname = 'Q111') > 0条件が (HAVING 句として) 追加されました。

于 2012-08-21T10:27:44.233 に答える
0

あなたが言ったように、あなたの質問は複雑です。あなたのスキーマに不慣れな人がそれを理解するのは難しいです。そこで、複数の項目を要約するクエリの一般的な提案を提供します。

クエリテキストを保存できる適切なクライアントプログラムを使用してください。また、役立つクエリテキストをきれいに印刷(フォーマット)する場合。

各サマリークエリを個別に開発してテストします。それぞれが独立して、必要な正しい要約結果を生成することを確認してください。

次に、これらのクエリをレポートキー(私が信じている場合はPSU)で結合して、複数の要約結果を生成します。それが機能していることを確認してください。

SELECTステートメントの直後のコメントにクエリ名とバージョン番号を入力します。たとえば、

SELECT /* pregnancy outcomes 1.1 */
       sms_psu.name1 AS PSU,
       woman_data.answertext AS NumberOfPreg, etc.

これにより、MySQLSHOW FULL PROCESSLISTを使用して、実行されている正確なクエリを特定できます。

最後に、結果クエリ(多数のネストされたサブクエリで構成される)がアプリケーションの要件に対して遅すぎる場合は、それを最適化します。

これらの手順に従うと、次の手順は% live birth要約クエリを作成することだと思います。

于 2012-08-17T12:29:03.890 に答える
0

あなたの質問に対する答えは、CASE ステートメントです。

アイデアは、外側の WHERE 句を拡張して、関心のあるすべての行を含めることです。次に、SELECT 句で CASE ステートメントを使用して、単一変数ベースで行をフィルター処理します。

これを次のようにまとめてみました。

SELECT sms_psu.name1 AS PSU,
       woman_data.answertext AS NumberOfPreg,
       Count(case when sms_psu.state = 19 AND sms_psu.district = 1 AND sms_psu.psu = 2 AND fieldname = 'Q111'
                  then woman_data.answertext
             end) /
       (SELECT Count(woman_data.answertext)
        FROM woman_data INNER JOIN
              sms_household
              ON woman_data.prim_key = ms_household.hhid INNER JOIN
              sms_psu
              ON sms_psu.psu = sms_household.psu
        WHERE  sms_psu.state = 19 AND sms_psu.district = 1 AND sms_psu.psu = 2 AND
               fieldname = 'Q139'
       ) AS totalcpuntpreg,
       Count(case when sms_psu.state = 19 AND sms_psu.district = 1 AND sms_psu.psu = 2 AND fieldname = 'Q112'
                  then woman_data.answertext
             end) /
       (SELECT Count(woman_data.answertext)
        FROM woman_data INNER JOIN
              sms_household
              ON woman_data.prim_key = ms_household.hhid INNER JOIN
              sms_psu
              ON sms_psu.psu = sms_household.psu
        WHERE  sms_psu.state = 19 AND sms_psu.district = 1 AND sms_psu.psu = 2 AND
               fieldname = 'Q139'
       ) AS totalcpuntpreg

FROM woman_data INNER JOIN
     sms_household
     ON woman_data.prim_key = sms_household.hhid INNER JOIN
     sms_psu
     ON sms_psu.psu = sms_household.psu
WHERE sms_psu.state = 19 AND sms_psu.district = 1 AND sms_psu.psu = 2 AND
      fieldname in ('Q111', 'Q112')
GROUP BY woman_data.answertext
        sms_household.psu  

ただし、一部の詳細を見逃している可能性があります。

于 2012-08-17T13:27:02.717 に答える