Access 中的多个自联接或联合

multiple self joins or unions in Access

我有这个看起来像这样的虚拟诱惑

      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 我会收到错误消息(不支持连接表达式)或相同结果的重复值。有什么建议吗?

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

如前所述,请考虑 MS Access 的独特枢轴查询 crosstab,它是 Access UI 创建功能区查询选项卡中列出的 object。在设计视图中,您将 select 列分为两种 GROUP BY 类型(除了 Values 最后一种是聚合类型)

  1. 行标题字段(例如 ID、月、年)- 可以是多个 table 列
  2. 列标题字段(例如,指标)- 只能是 一个,其中列导致单独的列
  3. 值字段(例如 Sum)- 只能是 一个 使用聚合函数的列 - Sum()、Max()、Avg() 等

将创建结果 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;