2010-07-21 5 views
1

나열된 모든 필드의 합계를 찾으려고하지만 하위 쿼리 인 경우 별칭을 사용해야합니다. 나열된 별칭을 사용하면 열/필드를 알 수없는 오류가 발생합니다 ... 그룹을 기준으로 합계 (점)를 시도하면 그룹 조항 오류가 잘못 표시됩니다.SQL - 별칭 별 필드 합계

SELECT DISTINCT pr.competitorID AS compID, pr.age, CONCAT(pr.firstname, ' ', pr.lastname)AS name 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=1 AND participation_reports.competitorID=compID LIMIT 1) AS '100m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=25 AND participation_reports.competitorID=compID LIMIT 1) AS '200m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=37 AND participation_reports.competitorID=compID LIMIT 1) AS '400m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=49 AND participation_reports.competitorID=compID LIMIT 1) AS '800m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=61 AND participation_reports.competitorID=compID LIMIT 1) AS '1500m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=67 AND participation_reports.competitorID=compID LIMIT 1) AS '3000m' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=69 AND participation_reports.competitorID=compID LIMIT 1) AS 'Javelin' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=81 AND participation_reports.competitorID=compID LIMIT 1) AS 'Shot Put' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=93 AND participation_reports.competitorID=compID LIMIT 1) AS 'Discus' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=105 AND participation_reports.competitorID=compID LIMIT 1) AS 'High Jump' 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=117 AND participation_reports.competitorID=compID LIMIT 1) AS 'Long Jump' 
, (SELECT SUM(participation_reports.points) FROM participation_reports WHERE participation_reports.competitorID=compID) AS total 
FROM participation_reports AS pr 
JOIN event_data on event_data.eventID=pr.heatEventID 
WHERE event_data.minAge <= pr.age AND event_data.maxAge >= pr.age AND sex = 'F' 
AND total > 0 
LIMIT 30 

어떤 아이디어 주셔서 감사합니다.

+0

이것은 http://stackoverflow.com/questions/3289941/unknown-column-in-where-its-defined-right-there와 중복 된 것으로 보입니다. –

답변

1

파생 테이블로 쿼리 한 다음 합계를 선택하십시오.

+0

임시 테이블을 사용해야합니까? 어떤 대안? –

+0

@ pc-nerd - 스키마에 대한 자세한 정보를 통해 대답을보다 쉽게 ​​구체화 할 수 있습니다. 모든 하위 쿼리의 필요성을 제거하기 위해 조인에서 참조 할 수있는 테이블이 있습니까? 그것들을 기둥으로 사용하는 데 당신은 어떻게 의존하고 있습니까? 출력 그룹화를 통해 얻을 수 있습니까? 또 다른 옵션은 이것을 뷰에 넣은 다음 뷰에서 쿼리하는 것입니다. –

+0

Ok ... 선호하는 경우 관련 정보를 붙여 넣을 수 있습니다. columsn이 하위 쿼리 인 이유는 각 열이 스포츠라는 것입니다. 그러나 스포츠 이벤트는 쿼리의 연령대/성별 (모든 연령 그룹/성별에 대해 PHP 루프에서 실행 됨)에 따라 변경됩니다. 따라서 이벤트는 해당 스포츠/성/연령에 따라 다릅니다. 열은 분명히 필요합니다 ... 어떻게 상호 참조가 그들을 제거 할 것입니까? –

3

이에게 탄 보내기

SELECT 
    pr.competitorID AS compID 
    , pr.age 
    , CONCAT(pr.firstname, ' ', pr.lastname) AS name 
    , SUM(CASE 
     WHEN pr.heatEventID=1 
     THEN pr.points 
     ELSE 0 END) AS "100m" 
    , SUM(CASE 
     WHEN pr.heatEventID=25 
     THEN pr.points 
     ELSE 0 END) AS "200m" 
    ... 
    , SUM(CASE 
     WHEN pr.heatEventID IN (1,25,...) 
     THEN pr.points 
     ELSE 0 END) AS total 
FROM 
    participation_reports pr 
    JOIN event_data 
    ON event_data.eventID = pr.heatEventID 
WHERE 
    ... 
GROUP BY 
    pr.competitorID 
    , pr.age 
    , CONCAT(pr.firstname, ' ', pr.lastname) 
+0

+1 이것은 정말 좋은 접근 방법이기도합니다. –

+0

그 해결책은 나던 사실을 기반으로합니다. 사실 WHERE 절에서 열 별칭을 사용할 수 없습니다 (별칭은 열을 검색 한 후 적용 할 마지막 항목이며, 조건이 일치하고 정렬 된 것입니다. etc ...) SELECT 절에서 정의하는 것 이외의 다른 곳에서 열 별칭을 사용할 수 없다고 생각합니다. EDIT : 구체적으로 - 상위 SUM (점수) 행이 필요합니다. SUM (점수 없음)이 0 인 행을 원하지 않습니다 (참여하지 않음을 나타냄). –

+0

WHERE 절에서 열 별칭을 사용할 필요가 없습니다. – bernie

0

난 당신이 무엇을 필요에 아주 명확하지 않다,하지만 당신은 모든 별칭 컬럼의 합을 원하는 경우, 당신의 문제는 법적 열 아니라는 것을하지 않을 수도 있습니다 이름? 어때요 ...

SELECT DISTINCT pr.competitorID AS compID, pr.age, CONCAT(pr.firstname, ' ', pr.lastname)AS name 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=1 AND participation_reports.competitorID=compID LIMIT 1) AS c_100m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=25 AND participation_reports.competitorID=compID LIMIT 1) AS c_200m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=37 AND participation_reports.competitorID=compID LIMIT 1) AS c_400m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=49 AND participation_reports.competitorID=compID LIMIT 1) AS c_800m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=61 AND participation_reports.competitorID=compID LIMIT 1) AS c_1500m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=67 AND participation_reports.competitorID=compID LIMIT 1) AS c_3000m 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=69 AND participation_reports.competitorID=compID LIMIT 1) AS Javelin 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=81 AND participation_reports.competitorID=compID LIMIT 1) AS Shot_Put 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=93 AND participation_reports.competitorID=compID LIMIT 1) AS Discus 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=105 AND participation_reports.competitorID=compID LIMIT 1) AS High_Jump 
, (SELECT participation_reports.points FROM participation_reports WHERE participation_reports.heatEventID=117 AND participation_reports.competitorID=compID LIMIT 1) AS Long_Jump, 
c_100m + c_200m + c_400m + c_800m + c_1500m + c_3000m + Javelin + Shot_Put + High_Jump + Long_Jump 
, (SELECT SUM(participation_reports.points) FROM participation_reports WHERE participation_reports.competitorID=compID) AS total 
FROM participation_reports AS pr 
JOIN event_data on event_data.eventID=pr.heatEventID 
WHERE event_data.minAge <= pr.age AND event_data.maxAge >= pr.age AND sex = 'F' 
AND total > 0 
LIMIT 30 

또는이 문제를 오해 한 적이 있습니까?

+0

안녕하세요, 해결책을 시도했지만 아직 정의되지 않은 c_100m 열이 표시됩니다. 나는이 글에서 필자가 필드 별칭을 사용할 수 없다는 것을 확실히 알고있다. *** 내 현재 거의 솔루션을 사용하여 PHP를 사용하여 루프 및 각 필드를 쿼리하는 것입니다 생각하고 다른 두 번 별도의 쿼리를 기반으로 합계를 두 번 ineffient -하지만 바로 더 많은 시간이 내 최종 테이블은 긴급 .... thnx이지만 –

+0

오른쪽. 미안해서 더 도움이되지 못했습니다. –