2013-08-23 5 views
0

여러 하위 쿼리를 기반으로 값을 계산하는 쿼리가 있습니다. 하위 쿼리는 특정 타임 스탬프를 기반으로합니다. 많은 다른 타임 스탬프 레코드에 대해이 값을 계산하고 싶습니다. 나는 그것을 어떻게하는지 알 수 없다.MySql : 여러 하위 쿼리를 기반으로 값 계산

기본 공식은 (S11S4CreateSessionReqRcvd - S11S4CreateSessionRespAccSent) * 100/S11S4CreateSessionRespAccSent 내가 지금 여기에 테이블에 붙여 넣기하는 방법을 모른다

SELECT 
((((select ref_data FROM test.sgw_S5S11 where timestamp = "2013-08-21 00:00:06" and ref_type = "S11S4CreateSessionReqRcvd") - (select ref_data FROM test.sgw_S5S11 
where timestamp = "2013-08-21 00:00:06" and ref_type = "S11S4CreateSessionRespAccSent")) * 100)/(select ref_data FROM test.sgw_S5S11 
where timestamp = "2013-08-21 00:00:06" and ref_type = "S11S4CreateSessionReqRcvd")) as MyCalc 

가 여기 CSV 형식으로 내 데이터의 샘플입니다 내 데이터 샘플. ,,

의 mykey, 타임 스탬프, ref_type, ref_data 1016101을, 128,042,907 S5S8CreateSessionReqSent을 "2013년 8월 21일 0시 0분 6초을"(나는 그것이 CSV 형식으로 그래서 여기에 테이블을 넣어하는 방법을 모른다) 1016102, "2013-08-21 00:00:06", S5S8CreateSessionRespAccRcvd, 127088838 1016103, "2013-08-21 00:00:06", S5S8CreateSessionRespRejRcvd, 615553 1016104, "2013-08-21 00:00:06" , S5S8CreateBearerRespRejSent, 103 1016107, "2013-08-21 00:00:06", S5S8CreateBearerRespAccSent, 9932 1016106, "2013-08-21 00:00:06", S5S8CreateBearerRespRejSent, 103 1016107, "2013-08-21 00 : 00 : 06 ", S11S4CreateSessionReqRcvd, 128255390 1016108,"2013-08-21 00:00:06 ", S11S4CreateSessionRespAccSent, 127114539 1016109,"2013-08-21 00:00:06 ", S11S4CreateSessionRespRejSent, 713325 1016110,"2013-08 -21 00:00:06 ", S11S4CreateBearerReqSent, 10028 1016111,"2013-08-21 00:00:06 ", S11S4CreateBearerRespAccRcvd, 9932 1016112,"2 013-08-21 00:00:06 ", S11S4CreateBearerRespRejRcvd, 42

모든 도움을 주시면 대단히 감사하겠습니다 !!!

답변

1

이 쿼리는 별도의 행에 특성을 저장했기 때문에 어색합니다. 이 디자인을 Entity-Attribute-Value라고하며, 일반적으로 관계형 데이터베이스에서는 좋지 않습니다.

다음 쿼리는 작성하기 좀 더 효율적이고 더 쉬울 수 있습니다

SELECT (eav.ReqRcvd - eav.AccSent) * 100/eav.AccSent AS MyCalc 
FROM (
    SELECT timestamp, 
    MAX(IF(ref_type='S11S4CreateSessionReqRcvd', ref_data)) AS ReqRcvd, 
    MAX(IF(ref_type='S11S4CreateSessionRespAccSent', ref_data)) AS AccSent 
    FROM test.sgw_S5S11 
    WHERE timestamp = '2013-08-21 00:00:06' 
    GROUP BY timestamp 
) AS eav; 

PS : 문자열과 날짜 리터럴하지 따옴표 "에 대한 사용 작은 따옴표 '. 표준 SQL에서 큰 따옴표는 테이블 및 열 식별자를 구분하기위한 것입니다. MySQL은 두 가지 유형의 따옴표를 기본적으로 동일하게 취급하지만 SQL_MODE의 영향을받으며 다른 브랜드의 RDBMS를 사용하는 경우에도 동일한 방식으로 동작하지 않습니다. 그래서 따옴표를 사용하는 습관을 표준 방식으로 개발하는 것이 좋습니다.

+0

감사합니다. @BillKarwin. 당신의 대답은 내가했던 것보다 훨씬 더 많은 것을 얻었지만 더 많은 타임 스탬프를 허용하도록 타임 스탬프를 확장함에 따라 각 ref_type에서 모든 것을 사용할 수있는 최대 값을 계속 제공했습니다. MAX가 (IF (ref_type = 'S11S4CreateSessionReqRcvd', ref_data, 0)) MAX로 변경해야했는데, MAX에서 (IF (ref_type = 'S11S4CreateSessionReqRcvd', ref_data) group by 문은 적절한 ref_type이 아닌 마지막 반복문이었습니다. 나는이 모든 것을 perl 스크립트로 끌어 와서 그렇게 할 것이라고 생각하지만 감사 드리고 싶습니다. – user2712370

+0

나는 내가 원하는 것을 얻지 못했지만 당신의 접근 방식을 사용하여 많은 것을 배웠다. 다시 한 번 감사드립니다! – user2712370