2016-03-04 143 views
0

(我是一個Access/SQL初學者,所以請忍受我!)我有3個表 - 1與地區和辦事處,每月下降,2與月銷售(1月 - 每月總計)。我需要生成一份報告,顯示區域,辦公室和按月分解的平均銷售額/日期。所以我需要8列 - 地區,辦公室和6個月的專欄。到目前爲止,我已經能夠將兩個銷售表結合起來,並將其與Regions表結合起來,並將每個辦事處的月銷售額分成一月份(而不是每天),但尚未能夠將總數除以稍後再說)。我的問題是現在我被卡住了,我試圖在Access的設計視圖中將Jan的二月鏡像到列表中,但是它寫入的SQL與Jan結合使用(總和如果month = jan和feb),哪一個當然不會返回當我運行它。我知道我需要爲剩下的幾個月編寫嵌套選擇,但是我找不到任何與我需要完成的任務相當的例子。以下是我迄今爲止:SQL嵌套選擇 - 訪問

SELECT Regions.Region, [SalesReg Union].Office, [SalesReg Union].Sales AS Jan 
FROM Regions INNER JOIN [SalesReg Union] ON Regions.Office = [SalesReg Union].Office 
GROUP BY Regions.Region, [SalesReg Union].Office, [SalesReg Union].Sales 
HAVING ((([SalesReg Union].Sales)=(Sum(IIf([Month]='Jan',[Sales],0))))); 

我難倒就如何巢剩下的幾個月選擇,任何指導,將不勝感激!

+0

我可能會建議使用「嵌套查詢」缺少更好的術語。在你的「發件人」聲明中,你可以定義一個新的表格。例如,你可能有'SELECT Table1.ID,sum(Jan。銷售)FROM Table1內部聯接(SELECT Table1.ID,Table1.Sales FROM Table1 WHERE Table1.Month ='January')Jan on Table1.ID = Jan.ID GROUP BY Table1.ID'您必須創建一個新表每個月,但這應該工作。讓我知道你是否需要更多幫助。 – phroureo

回答

0

考慮使用MS Access的唯一crosstab query(查詢設計功能區下的可用查詢類型),它將一列中不同的值轉化爲多個列,並跨指定值進行聚合。在查詢設計中,可以指定以下三個部分組成:

  1. 行標題(在GROUPBY列,可以是多個領域)(即地區,銷售處)
  2. 列標題 (這使得在PIVOT子句樞軸柱,可以只有一個字段)(即,銷售月)
  3. VALUE(聚集的數字列在使用條款,只能是一個字段)(即。銷售)

下面是SQL輸出,你可以看到使用中它彙總查詢:

TRANSFORM Avg([SalesReg Union].Sales) AS AvgSales 
SELECT Regions.Region, [SalesReg Union].Office 
FROM Regions INNER JOIN [SalesReg Union] ON Regions.Office = [SalesReg Union].Office 
GROUP BY Regions.Region, [SalesReg Union].Office 
PIVOT ([SalesReg Union].[Month]); 

要在報表中使用交叉表查詢作爲記錄源,則需要完全指定的值使用PIVOT()IN()條款(使報告能事先知道自己的結構)樞列:

PIVOT ([SalesReg Union].[Month]) IN ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun') 

此外,你甚至可以使用子集本IN()條款。下面只顯示前三個月。

PIVOT ([SalesReg Union].[Month]) IN ('Jan', 'Feb', 'Mar') 

有時,這可能是必要的,因爲列在表/查詢的最大數量是255,其可以很容易地在根據列報頭字段的交叉表到達。最後請注意,這個查詢不能移植到其他RDMS的。它是唯一的MS Access SQL查詢類型。

+0

現在我還需要製作一個能夠根據選定日期範圍運行查詢的輸入表單。我將PIVOT更改爲[SalesReg Union] .Start,與月份(1/1/2015而不是'Jan')的工作方式相同,但我無法弄清楚如何在結束日期中工作,以便表單將正常工作。你有什麼想法?再次感謝你的幫助! – kms5549

+0

只需爲日期範圍添加一個'WHERE'子句即可。無需調整'PIVOT()'。 – Parfait

0
SELECT Regions.Region, [SalesReg Union].Office, Sum(Jan.Sales) as 'Jan', Sum(Feb.Sales) as 'Feb', Sum(Mar.Sales) as 'Mar', Sum(Apr.Sales) as 'Apr', Sum(May.Sales) as 'May', Sum(Jun.Sales) as 'Jun' 
FROM Regions 
INNER JOIN [SalesReg Union] ON Regions.Office = [SalesReg Union].Office 
INNER JOIN (Select SR.Office, SR.Sales FROM [SalesReg Union] SR WHERE SR.Month = 'Jan') Jan on Jan.Office = Regions.Office 
INNER JOIN (Select SR.Office, SR.Sales FROM [SalesReg Union] SR WHERE SR.Month = 'Feb') Feb on Feb.Office = Regions.Office 
INNER JOIN (Select SR.Office, SR.Sales FROM [SalesReg Union] SR WHERE SR.Month = 'Mar') Mar on Mar.Office = Regions.Office 
INNER JOIN (Select SR.Office, SR.Sales FROM [SalesReg Union] SR WHERE SR.Month = 'Apr') Apr on Apr.Office = Regions.Office 
INNER JOIN (Select SR.Office, SR.Sales FROM [SalesReg Union] SR WHERE SR.Month = 'May') May on May.Office = Regions.Office 
INNER JOIN (Select SR.Office, SR.Sales FROM [SalesReg Union] SR WHERE SR.Month = 'Jun') Jun on Jun.Office = Regions.Office 
GROUP BY Regions.Region, [SalesReg Union].Office 

該查詢肯定不是最漂亮的查詢,但它可能會是功能,讓你想你所需要的。