2012-06-21 2 views
0

SELECT 문에 계산 열을 추가 할 때까지 잘 실행되는 SQL Server 쿼리가 있습니다. 그런 다음 이상한 SQL Server 오류가 발생합니다. 여기 SQL Server SELECT 문의 집계 열 쿼리

는 SQL의 : 문제는 라인과 함께 시작

SELECT 
    outmail_.MessageID_, 
    CONVERT(VARCHAR(10),outmail_.Created_,120) AS 'Issue', 
    lyrReportSummaryData.mailed, 
    lyrReportSummaryData.successes, 
    COUNT(*) AS 'opens', 
    COUNT(DISTINCT clicktracking_.MemberID_) AS 'unique_opens', 
    convert(decimal(3,1),((convert(float,[unique_opens]))/[successes]) * 100) AS 'Rate' 
FROM 
    outmail_ 
RIGHT JOIN 
    clicktracking_ ON clicktracking_.MessageID_ = outmail_.MessageID_ 
RIGHT JOIN 
    lyrReportSummaryData ON lyrReportSummaryData.id = clicktracking_.MessageID_ 
GROUP BY 
    outmail_.MessageID_, CONVERT(VARCHAR(10), outmail_.Created_,120), 
    lyrReportSummaryData.mailed, lyrReportSummaryData.successes 

convert(decimal ...이 포함되면, 나는 다음과 같은 오류 얻을 :

Error 8120: Column 'lyrReportSummaryData.unique_opens' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

내가 해결하는 방법을 잘 모르겠어요를 오류 이후에 나는 GROUP BY 절에서 그것을 사용하는 방법을 모른다. (그렇게해야 할 필요가 없다.)

진행 방법에 대한 제안 사항이 있으십니까? 감사.

답변

2

나는 당신이 하위 쿼리와 쿼리의 대부분을 수행하는 경우

, 당신이 할 수있는 ... 내가이 일을보다 효율적인 방법을 지적 할 수있는 것보다 더 나은 DBA 기술을 가진 확실히 사람 합니다만, 다음의 서브 쿼리의 결과에 계산을 수행

SELECT 
    MessageID_, 
    Issue, 
    mailed, 
    successes, 
    opens, 
    unique_opens, 
    convert(decimal(3,1),((convert(float,[unique_opens]))/[successes]) * 100) AS 'Rate' 

FROM 
(SELECT 
     outmail_.MessageID_, 
     CONVERT(VARCHAR(10),outmail_.Created_,120) AS 'Issue', 
     lyrReportSummaryData.mailed, 
     lyrReportSummaryData.successes, 
     COUNT(*) AS 'opens', 
     COUNT(DISTINCT clicktracking_.MemberID_) AS 'unique_opens' 


    FROM outmail_ 
    RIGHT JOIN clicktracking_ ON clicktracking_.MessageID_ = outmail_.MessageID_ 
    RIGHT JOIN lyrReportSummaryData ON lyrReportSummaryData.id = clicktracking_.MessageID_ 

    GROUP BY outmail_.MessageID_, CONVERT(VARCHAR(10), outmail_.Created_,120), lyrReportSummaryData.mailed, lyrReportSummaryData.successes 
    ) subquery /* was 'g' */ 

효과적으로 어떤이가하는 것은 그룹을 실행하고, 그 기반으로, 나중에 계산을 수행합니다.

별칭에는 별칭을 사용하지 않아도 별칭 (이 경우 '하위 쿼리')을 지정해야합니다.

+0

정상적으로 작동해야하지만 구문 오류가 발생했습니다. 오류 102 : 구문이 잘못되었습니다. ')'어떤 아이디어입니까? 감사. – jalperin

+0

검색어 끝에 'g'가 누락되었습니다. 일단 내가 그것을 추가, 모든 일했습니다. 나는 분명히 MSSQL 초보자이다. 'g'는 무엇을 나타내는가? – jalperin

+0

g는 하위 쿼리의 별칭입니다. 테이블에 별명을 줄 수도 있고 똑같이 작동 할 수도 있습니다. 예를 들어'select s.staffid, s.name, p.payrate, p.startdate from staff s join payrate p on s.staffid = p.staffid' - 예, 이것은 참여할 수 있다는 것을 의미합니다. 질문. –