TRANSFORM与SELECT间使用Switch嵌套子查询报错问题咨询
问题原因
你遇到的报错不是Switch函数本身导致的,核心原因是Access的TRANSFORM交叉表查询的聚合参数中不允许嵌套多层聚合子查询。
你当前写法的问题有两个:
- TRANSFORM后跟随的是SUM聚合函数,你在Switch的分支逻辑里嵌入了两层带SUM聚合的子查询,交叉表本身已经存在
GROUP BY Sector的聚合规则,多层聚合嵌套会触发Access查询引擎的语法校验错误,也就是你看到的提示:
子查询中不允许多层GROUP BY子句
- 原SQL的WHERE子句末尾多了一个多余的双引号,属于语法错误。
解决方法
方案1:提前计算系数值
先单独执行系数查询拿到对应的值,再代入到交叉表查询中,避免嵌套子查询:
- 执行下方查询拿到Name1对应的系数:
SELECT sum(MktValue)/(select sum(MktValue) FROM Table2 WHERE Portefeuille IN ( 'Name1' , 'Name2') AND LaDate = #27/10/2021#) AS coef1 FROM Table2 WHERE Name IN ( 'Name1') AND LaDate = #27/10/2021#
- 把拿到的coef1值替换到交叉表查询中,修改后的可执行SQL如下:
TRANSFORM SUM(Rate* SWITCH(Name = 'Name1', [替换为你算出的coef1值], Name = 'Name2',0.75,true,0)) SELECT Sector FROM Table1 WHERE Name IN ( 'Name1' , 'Name2') AND LaDate = #27/10/2021# GROUP BY Sector Pivot Name
方案2:用关联子查询提前引入系数
如果不想分两次执行,可以把系数计算逻辑放在FROM子句中作为临时表关联,避免在聚合参数中嵌套子查询:
TRANSFORM SUM(t1.Rate * SWITCH(t1.Name = 'Name1', t2.coef, t1.Name='Name2',0.75, true,0)) SELECT t1.Sector FROM Table1 AS t1, ( SELECT sum(MktValue)/(select sum(MktValue) FROM Table2 WHERE Portefeuille IN ( 'Name1' , 'Name2') AND LaDate = #27/10/2021#) AS coef FROM Table2 WHERE Name IN ( 'Name1') AND LaDate = #27/10/2021# ) AS t2 WHERE t1.Name IN ( 'Name1' , 'Name2') AND t1.LaDate = #27/10/2021# GROUP BY t1.Sector Pivot t1.Name
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

