2012-06-21 27 views
0

我有一個SQL Server查詢運行得很好 - 直到我將計算列添加到SELECT語句。然後我得到一個奇怪的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' */ 

有效地這樣做是運行分組,再此基礎上,做了計算之後。

即使您不使用該別名,子查詢也必須被賦予一個別名(在本例中爲'subquery')。

+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' - 是的,這意味着您可以加入或對子附加額外的限制查詢。 – 2012-06-21 23:57:00