Access中的多个自我加入或联合

时间:2016-03-18 16:14:09

标签: sql ms-access union self-join

我有这个虚拟的临时表,看起来像这样

      ID     Sum    Indicator       Month    Year
       1     10     Ind1             3       2016
       1     20     Ind2             3       2016
       2     15     Ind1             3       2016
       2     19     Ind3             3       2016
       .     .      .                .       .
       .     .      .                .       . 
       50    5      Ind1             3       2016
       50    5      Ind2             3       2016
       50    5      Ind3             3       2016

我想得到的结果如下:

 ID    Ind1     Ind2    Ind3    Month    Year
 1     10       20      null    3        2016
 2     15       null    19      3        2016
 50    5        5       5       3        2016

我尝试过:

   select  a.ID,b.sum as Ind1,c.sum as Ind2,d.sum as Ind3  
   from (
          ( 
          dummytable a 
          left join dummytable b 
          on a.ID=b.ID
          )
        left join dummytable c 
        on a.ID=c.ID
        ) 
   left join dummytable d 
   on a.ID=d.ID 
   where b.Indicator=Ind1  and c.Indicator=Ind2 and d.Indicator=Ind3

此位捕获所有具有Ind1,2,3值的ID,因此从我的示例中仅显示所需结果的最后一行。我知道,因为Access不支持完全连接,所以应该使用union来捕获其余的组合。但是,我继续使用union我得到一条错误消息(不支持连接表达式)或重复相同结果的值。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如上所述,请考虑MS Access的唯一数据透视查询crosstab,它是Access UI创建功能区查询选项卡中列出的对象。在设计视图中,您可以选择两种GROUP BY类型的列(最后为Values聚合类型除外)

  1. 行标题字段(例如,ID,​​月,年) - 可以是多个表列
  2. 列标题字段(例如,指标) - 只能一个,其中列结果显示在单独的列中
  3. 值字段(例如,Sum) - 只能使用聚合函数一个列 - Sum(),Max(),Avg()等。
  4. 将创建生成的SQL(注意嵌入的聚合查询):

    TRANSFORM Sum(dummytable.Sum) AS SumOfSum
    SELECT dummytable.ID, dummytable.Month, dummytable.Year
    FROM dummytable
    GROUP BY dummytable.ID, dummytable.Month, dummytable.Year
    PIVOT dummytable.Indicator;
    

    结果

    ID  Month   Year    Ind1    Ind2    Ind3
    1   3       2016    10      20  
    2   3       2016    15              19
    50  3       2016    5       5       5
    

    对于在Access外部工作的通用RDMS数据透视查询,只需使用条件聚合。请注意其他SQL方言,IIF()函数必须替换为CASE/WHENIF/THEN

    SELECT dummytable.ID, dummytable.Month, dummytable.Year,
              SUM(IIF(dummytable.Indicator = 'Ind1', [Sum], NULL)) As Ind1,
              SUM(IIF(dummytable.Indicator = 'Ind2', [Sum], NULL)) As Ind2,
              SUM(IIF(dummytable.Indicator = 'Ind3', [Sum], NULL)) As Ind3
    
    FROM dummytable
    GROUP BY dummytable.ID, dummytable.Month, dummytable.Year;
    

答案 1 :(得分:-1)

要创建多值字段交叉表查询,必须为要计算的每个值创建单独的交叉表查询。然后,您可以使用选择查询来连接这些交叉表查询以显示所需的结果。