SQL嵌套选择 - 访问

时间:2016-03-04 22:00:00

标签: sql ms-access select nested

(我是一个Access / SQL初学者所以请耐心等待!)我有3个表 - 其中1个表区域和办公室位于每个表格下面,2表示每月销售额(1月至6月按月计算) )为每个办公室。我需要生成一个报告,显示Region,Office和按月分解的平均销售/日。所以我需要8列 - Region,Office和6 Month列。到目前为止,我已经能够将两个销售表联合起来,与Regions表一起加入,并将1月份每个办公室的月销售额分开(不是每天,避风港能够除以总数 - 但我和# 39;稍后会想出来的。我的问题是现在我被卡住了,我已经试图在Access的设计视图中反映1月份的二月的专栏,但是它写的SQL与Jan合并(如果是月份的总和= 1月) AND feb)当我运行它时,当然没有返回任何内容。我知道我需要为剩下的几个月编写嵌套选择,但我找不到任何可以与我需要完成的实例相媲美的例子。以下是我到目前为止的情况:

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)))));

我很难过如何在剩下的几个月内选择任何选择,任何指导都会受到赞赏!!

2 个答案:

答案 0 :(得分: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

这个查询肯定不是最漂亮的查询,但它可能会起作用并让你想要你。

答案 1 :(得分:0)

考虑使用MS Access'唯一crosstab query(查询设计功能区下的可用查询类型),它将一列的不同值转换为多列,并在指定值之间进行聚合。在查询设计中,您可以指定以下三个组件:

  1. ROW HEADING (groupby列,可以是多个字段)(即Region,Sales Office)
  2. COLUMN HEADING (在PIVOT子句中呈现的数据透视列,只能是一个字段)(即销售月份)
  3. VALUE TRANSFORM子句中使用的汇总数字列,只能是一个字段)(即,销售)
  4. 下面是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]);
    

    要在报告中使用交叉表查询作为记录源,您需要使用IN()中的PIVOT()子句完全指定数据透视列的值(因此报告事先知道自己的结构):< / p>

    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查询类型。