2016-03-04 174 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 

该查询肯定不是最漂亮的查询,但它可能会是功能,让你想你所需要的。