2015-05-13 58 views
1

我正在使用連接到Visual Basic的本地Access數據庫。我的查詢是具有多種功能的SQL字符串故障

SELECT RebateReceived, DatePart('yyyy',[RebateMailedDate]) AS MailedDate, Sum(RebateValue) as MoneyReceived 
    FROM RebateInfoStorage 
    where RebateReceived='Received' 
    group by RebateReceived 
    having DatePart('yyyy',[RebateMailedDate]) 

我試圖讓具有相同的一年已經「接收」,以確定需要進行求和(添加)一起記錄的字(S)的列。我對Group ByHaving關鍵字或Sum()DatePart()函數不是很熟悉。

回答

1

因此,DBMS將進入RebateInfoStorage並抓取所有行,其中RebateReceived = 'Received'。然後,它將對這些記錄進行分組,其中每個組包含表達式DatePart('yyyy', RebateMailedDate)評估爲相同值(即它們具有相同年份)的記錄。然後,對於每個組,它將返回包含年份的單個結果行以及該組中所有RebateValue的總和。操作按此順序進行。

HAVING就像WHERE,但發生在GROUP BY之後,並且是放置在一組記錄上的條件,而WHERE是記錄上的條件。

SELECT 
    YEAR(RebateMailedDate) AS MailedDate, 
    SUM(RebateValue) as MoneyReceived 
FROM 
    RebateInfoStorage 
WHERE 
    RebateReceived = 'Received' 
GROUP BY 
    YEAR(RebateMailedDate); 

編輯:它會出現年(x)是一個更合適的功能!

+0

'DatePart('yyyy',RebateMailedDate)''和'YEAR(RebateMailedDate)'都將返回相同的整數值。是什麼使Year()成爲更合適的功能? – HansUp

+1

這個功能現在正以更簡短的方式精確地說明了你到底在做什麼:今年。代碼對讀者來說更清楚。 – Luke

0

您應該按照具有RebateReceived ='Received'的DatePart進行分組。有關您可能參考的語法的更多信息,請參閱http://www.w3schools.com/sql/sql_having.asp

通過表示您的輸出表將根據該列中的唯一元素進行分組。例如,如果2014年有多個條目作爲年份,則它們將全部分組在一起,並且它們的RebateValue將被累加在一起。如果您正在使用RebateReceived進行分組,則所有條目將被添加,並且您最終將獲得一筆總額。