1

我有以下查询可以正常工作:

SELECT NomComplet, IIF(Count(FS3.Index) = 0, '0 (RAS)', Count(FS3.Index))  
 FROM ControleAcces INNER JOIN ( 
     Employes LEFT JOIN ( 
         SELECT FS1.Index, FS1.OTP, FS1.OTP, FS1.Axe, FS1.FaitSaillant, FS1.Utilisateur, FS2.DateInsertion  
         FROM FaitsSaillants AS FS1 INNER JOIN ( 
             SELECT Axe, Index, Max(FaitsSaillants.DateInsertion) AS DateInsertion  
             FROM FaitsSaillants  
             WHERE DateValue(DateInsertion) > #2010-01-01#  
             AND DateValue(DateInsertion) < #2011-12-31#  
             GROUP BY Axe, Index 
         ) AS FS2  
         ON (FS1.DateInsertion = FS2.DateInsertion  
         AND FS1.Index = FS2.Index)  
         WHERE FS1.Axe = 'Project' AND FS2.Axe = 'Project' 
     ) AS FS3  
     ON Employes.CIP = FS3.Utilisateur 
 )  
 ON ControleAcces.Valeur = Employes.CIP
 GROUP BY NomComplet
 ORDER BY NomComplet

不要费心去完全理解它,我只希望它在第一行编辑我的 IIF 条件。实际上,条件并没有多大作用,它检查查询返回的 FS3.Index 数量,(RAS)如果为 0 则连接。但是,实际上,我希望它检查FaitsSaillantswhere 中是否有任何行Axe = 'RAS'。如果 this 的 Count() > 0,则满足条件。

我可以对 IIF 段进行子查询,例如SELECT COUNT(Index) FROM FaitsSaillants WHERE Axe = 'RAS' AND Utilisateur = FS1.Utilisateur?如果结果为 0,那么我将添加RAS到我的第二个字段的结果中。如果没有,它会保持Count(FS3.Index).

我试过了,虽然语法正确,但问题是它无法检查Utilisateur = FS1.Utilisateur条件,因为 FS1 在主查询中。但是,我必须检查这一点,因为这是确保我正在寻找正确的东西的唯一方法:Utilisateur无论我是在主查询还是子查询中,它都必须相同。

编辑:

这是我从下面的答案/评论中尝试的简短版本。

SELECT NomComplet, IIf(FS2.AxeCount > 0, "0 (RAS)", count(FS3.index))
FROM ControleAcces INNER JOIN (Employes LEFT JOIN (SELECT FS2.AxeCount, FS1.Index, FS1.OTP, FS1.OTP, FS1.Axe, FS1.FaitSaillant, FS1.Utilisateur, FS2.DateInsertion  
         FROM FaitsSaillants AS FS1 INNER JOIN ( 
             SELECT Axe, Index, Max(FaitsSaillants.DateInsertion) AS DateInsertion, SUM(IIf(Axe = 'RAS', 1, 0)) As AxeCount  
             FROM FaitsSaillants 
             GROUP BY Axe, Index 
         ) AS FS2  
         ON (FS1.DateInsertion = FS2.DateInsertion  
         AND FS1.Index = FS2.Index)  
     )  AS FS3 ON Employes.CIP = FS3.Utilisateur) ON ControleAcces.Valeur = Employes.CIP
GROUP BY NomComplet;

我仍然收到关于 FS2.AxeCount 的错误,它不是聚合函数 (iff) 的一部分。

我也试过这个:

SELECT NomComplet, IIf((select count(*) from FaitsSaillants where axe='RAS' and Utilisateur=ControleAcces.Valeur) > 0, "0 (RAS)", count(FS3.index))
FROM ControleAcces INNER JOIN (Employes LEFT JOIN (SELECT FS2.AxeCount, FS1.Index, FS1.OTP, FS1.OTP, FS1.Axe, FS1.FaitSaillant, FS1.Utilisateur, FS2.DateInsertion  
         FROM FaitsSaillants AS FS1 INNER JOIN ( 
             SELECT Axe, Index, Max(FaitsSaillants.DateInsertion) AS DateInsertion, SUM(IIf(Axe = 'RAS', 1, 0)) As AxeCount  
             FROM FaitsSaillants 
             GROUP BY Axe, Index 
         ) AS FS2  
         ON (FS1.DateInsertion = FS2.DateInsertion  
         AND FS1.Index = FS2.Index)  
     )  AS FS3 ON Employes.CIP = FS3.Utilisateur) ON ControleAcces.Valeur = Employes.CIP
GROUP BY NomComplet, ControleAccess.Valeur;
4

2 回答 2

1

我有点不清楚你想在 FaitsSaillants 表中检查什么;你说:

我希望它检查 FaitsSaillants 中是否有 Ax = 'RAS' 的行。如果 this 的 Count() > 0,则满足条件。

但你也说:

类似于 SELECT COUNT(Index) FROM FaitsSaillants WHERE Ax = 'RAS' AND Employes.CIP = FS3.Utilisateur

我的猜测是您的意思是SELECT COUNT(Index) FROM FaitsSaillants WHERE Axe = 'RAS',因为在第二个 SQL 语句中,您要加入两个未在FROM子查询的子句中引用的表。

DCount在 IIF 语句中使用怎么样?

IIF(DCount("Index", "FaitsSaillants", "Axe='RAS'"), '0 (RAS)', Count(FS3.Index)) 

如果您的意思是 ,这应该可以工作SELECT COUNT(Index) FROM FaitsSaillants WHERE Axe = 'RAS',但是如果您有其他想法,则需要对其进行修改。

不过需要注意的是:我会尽量少用“域”函数(DCount、DLookup 等),因为它们很慢。

顺便说一句,我相信你也可以在你的 IIF 语句中使用子查询(它会给你一个错误吗?它似乎对我有用):

IIF((SELECT COUNT(*) FROM FaitsSaillants WHERE Axe = 'RAS'), '0 (RAS)', Count(FS3.Index)) 

只要确保将子查询放在括号中即可。

于 2012-11-17T13:51:51.300 回答
1

FS3.Index如果没有相应的记录,则为 NULL,因为 LEFT JOIN。不会考试

IIf(IsNull(FS3.Index), ..., ...)

……够了吗?我不确定,因为还涉及其他条件和连接。


更新(重述评论)

我们可以从最里面的嵌套 SELECT (FS2) 中获取所需的计数 (AxeCount):

SELECT
    Axe, Index, Max(FaitsSaillants.DateInsertion) AS DateInsertion,
    SUM(IIf(Axe = 'RAS', 1, 0)) As AxeCount
FROM FaitsSaillants  
...

此中间结果必须通过将其包含在中间 SELECT (FS3) 的选择列表中来传递给最外层的 SELECT:

SELECT FS2.AxeCount, FS1.Index, ...

最外面的 SELECT 有一个 GROUP BY 子句。在这种情况下,选择列表的所有字段必须包含在 GROUP BY 子句中或必须包含在聚合函数中。GROUP BY 子句按此子句中列出的字段对行进行分组。这通常会减少行数,因为它们的组字段中相似的几行被压缩成一行。这意味着选择列表的其余字段(不在组字段中)的值必须组合在一起。这就是聚合函数的作用。聚合函数是

  • 平均(平均)
  • 数数
  • 第一,最后
  • 最小值、最大值(最小值、最大值)
  • StDev、StDevP(标准差)
  • Var, VarP(方差)

请参见SQL 聚合函数 (Access)

现在,我们可以将它添加到最外层的选择列表中

IIf(SUM(FS2.AxeCount) > 0, ..., ...) 
于 2012-11-19T14:54:16.620 回答