2012-08-17 7 views
1

복잡한 SQL 문을 처음 사용하여 도움이됩니다. 결과 세트의 절반을 표시하고 남은 것으로 고생했습니다. 필요한단일 MySQL 문에서 여러 백분율 계산

결과 : 아래 작성된 SQL로

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

, 나는 처음 3 열을 얻는 것을 처리했다.

두 번째 및 세 번째 열은 fieldname = 'Q111'의 문장이 필요한 곳에서 필요합니다. 네 번째 열은 백분율을 요구하는 반면 진술서는 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 내 쿼리 내가 지금 쓰기가 오전 스피 Q112

PSU에 대한 추가 행을 받고 있다는 accordingly.The 문제를 업데이트 나 도움 임신 번호 | 임신 비율 | 임신 수 중 출산율 %.
1 | 2 | 67 % | 40 %
2 | 1 | 33 % | 80 %
2 | 1 | 0 % | 20 % (Q112의 경우 3 행이 추가됩니다)

하지만 그룹별로 수행하는 동안 Q112 항목이 필요하지 않습니다. case 문과 main 문을 별도로 사용할 수 있습니까? 나는 그룹과 함께 "having"을 사용하려고했지만 dint는 예상 된 결과를 얻는다.

+0

에 오신 것을 환영합니다. 논리적으로 코드를 표시하는 방법을 이해하면 매우 유용합니다. 귀하의 질문을 편집하려고 시도했습니다. 데이터에 대한 더 많은 정보를 얻는 것도 도움이됩니다. –

+0

'fieldname' 열은 어디에서 왔습니까? 그 앞에 테이블 별칭이 없습니다. –

답변

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

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

Ollie Jones와 Gordon Linoff에게 감사드립니다. 나는 어떤 포럼에서나 처음으로 글을 올리려고 많은 것을 당연시했습니다. 다음 번에는 조심할 것입니다. – user1606540

+0

Gordon, 귀하의 제안으로 제 쿼리를 업데이트했지만 다른 문제가 있습니다. 내가 답변으로 게시물에 설명했다. 기본적으로 위의 쿼리로, 나는 Q112에 대한 추가 행을 얻고있다. 제 4 열의 백분율을 계산하고 행을 추가하지 않기 위해서만 Q112의 기록이 필요합니다. – user1606540

+0

이것은 Q112에 answertext와 psu가 표시되지 않는 Q112에 대한 데이터가 있다는 것입니다. 이 데이터를 실제로 필터링하고 싶습니까? –

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 절로).