2012-08-17 71 views
1

我是新來的複雜SQL語句,需要幫助。 我已經設法顯示結果集的一半,並與剩餘的掙扎。在單個MySQL語句中計算多個百分比

需要

結果:

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

下面寫的SQL,我設法拿到第3列。

第二和第三列要求在fieldname = 'Q111'的陳述中。第4列要求與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 

戈登,你的建議幫了我一個lot.I更新了我的詢問,我有寫,現在是,IAM得到額外一行Q112

PSU accordingly.The問題|懷孕次數|懷孕百分比|懷孕人數中的活產百分比。
1 | 2 | 67%| 40%
2 | 1 | 33%| 80%
2 | 1 | 0%| 20%(第三排是Q112的附加)

但我不需要Q112條目,而我做分組。我可以在case語句和主要where語句中分別使用group嗎?我嘗試用「有」與團體,但力量得到預期的結果。

+0

歡迎來到計算器。如果你弄清楚如何在邏輯上顯示你的代碼,這是非常有用的;我已經編輯你的問題,試圖做到這一點。有關您的數據的更多信息也很有幫助。 – 2012-08-17 12:18:13

+0

'fieldname'列從哪裏來?它前面沒有表別名。 – 2012-08-21 09:33:39

回答

0

如上所述,您的查詢是複雜的。不熟悉模式的人很難理解它。因此,我將針對彙總多個項目的查詢提供一般性建議。

使用一個體面的客戶端程序,讓您保存查詢文本。如果它還能打印(格式化)有用的查詢文本。

分別開發和測試每個彙總查詢。確保每個人都獨自一人,從中產生正確的總結結果。

然後,將這些查詢一起加入報告密鑰(我相信您的案例中的PSU),以便生成多個摘要結果。確保它正在工作。

將一個查詢名稱和版本號在評論SELECT語句之後:例如,

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

這將讓你使用MySQL SHOW FULL PROCESSLIST找出它的確切查詢正在運行。

最後,如果結果查詢(由大量嵌套子查詢組成)對於您的應用程序需求來說太慢,請對其進行優化。

如果您按照這些步驟操作,那麼您的下一步就是開發您的% live birth彙總查詢,我相信。

+0

謝謝Ollie Jones.I是第一次在任何論壇發帖,所以把許多事情理所當然。下次再小心點。 – user1606540 2012-08-21 08:42:05

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 

不過,我可能會錯過一些細節。

+0

謝謝奧利瓊斯和戈登Linoff。我第一次在任何論壇上發帖,所以很多事情都是理所當然的。下次再小心點。 – user1606540 2012-08-21 07:05:41

+0

戈登,你的建議我更新了我的查詢,但得到了另一個問題。我已經在帖子中解釋了它作爲答案。基本上上述查詢,我​​得到了Q112的額外行。 我只需要Q112的記錄來計算我的第4列中的百分比並且不添加任何行。 – user1606540 2012-08-21 08:39:18

+0

這是說Q112有數據,其中answertext和psu未在Q111中表示。你真的想過濾這些數據嗎? – 2012-08-21 13:11:13

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子句)。