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
最后一种是聚合类型)
- 行标题字段(例如 ID、月、年)- 可以是多个 table 列
- 列标题字段(例如,指标)- 只能是 一个,其中列导致单独的列
- 值字段(例如 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/WHEN
或 IF/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;
我有这个看起来像这样的虚拟诱惑
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
最后一种是聚合类型)
- 行标题字段(例如 ID、月、年)- 可以是多个 table 列
- 列标题字段(例如,指标)- 只能是 一个,其中列导致单独的列
- 值字段(例如 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/WHEN
或 IF/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;