使用sum()跨三个表的MS ACCESS中的复杂SQL QUERY

时间:2017-08-29 08:56:14

标签: sql ms-access

我正在开展一个大型金融项目,在MS-ACCESS上用SQL构建查询。 这些是我的表。

CE
anomes    cod_c     Name       NIP      Nip_Grupo
201706    1         ABC        10       50
201706    1         DDD        12       50
201706    2         CCC        11       50

O
anomes    cod_c    ID_O        Nip_1   val_1     val_2
201706    1        ACA_00      10      500       200
201706    1        ACB_01      12      100       300
201706    2        ACC_07      11      50        400

OS
anomes    cod_c    ID_O        Stage
201706    1        ACA_00      1      
201706    1        ACB_01      2         
201706    2        ACC_07      3      

我需要的是像这样的列表

Name | Sum (val1 + val2) where stage =1 | Sum (val1 + val2) where stage =2 | 

ABC  |  x                               | x
DDD  |  x                               | x
CCC  |  x                               | x

此列表应仅通过输入Nip_Grupo(连接表CE中的公司)和AnoMes(时间码(年))引用来完成。 然后第二个表(O)有间接操作,我正在寻找Nip_1与CE上的nip相同,然后将该公司的每个操作与OS中的阶段相关联,这样我就可以对操作的总值求和,每个公司(CE)来自一个小组,每个阶段。

看起来非常简单,但我并不总是在表OS上有记录将表连接到表O中的条目,此时,我需要将结果显示为零。

这是我的查询到目前为止(一个简化版本以适合我的例子):

SELECT CE.Name, (Sum([O].[val1])+Sum(val2))
FROM CE 
    INNER JOIN O ON (CE.Cod_Contraparte = O.Cod_Contraparte) AND 
    (CE.AnoMes = O.AnoMes) AND (CE.Nip = O.Nip_1Titular)) 
     LEFT JOIN OPERACOES_STAGING_lnk AS OS ON (O.AnoMes = OS.AnoMes) AND 
    (O.ID_Operacao = OS.ID_Operacao)

WHERE (((CE.Nip_Grupo)=[enter nip:]) AND ((CE.anomes)=[enter anomes:]) AND 
      ((CE.Nip)=[O].[Nip_1])) AND ((OS.Stage)=[2])
GROUP BY CE.Nome
ORDER BY CE.Nome

这个查询只返回阶段为2时的总和,并且只有我在表OS上有记录,因为我有许多未通过阶段连接的操作我需要它显示零并打印完整基于group_id(Nip_Grupo)的公司列表

1 个答案:

答案 0 :(得分:0)

条件汇总可能会有所帮助

SELECT CE.name, 
      SUM( IIF( OS.stage=1, O.val1+O.val2,0)) as stage1,
      SUM( IIF( OS.stage=2, O.val1+O.val2,0)) as stage2
FROM CE 
INNER JOIN O ON (CE.Cod_Contraparte = O.Cod_Contraparte) AND (CE.AnoMes = O.AnoMes) AND (CE.Nip = O.Nip_1Titular)) AND ((CE.Nip)=[O].[Nip_1])) 
INNER JOIN OPERACOES_STAGING_lnk AS OS ON (O.AnoMes = OS.AnoMes) AND (O.ID_Operacao = OS.ID_Operacao)
WHERE (((CE.Nip_Grupo)=[enter nip:]) AND ((CE.anomes)=[enter anomes:])
GROUP BY CE.Nome