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 の数をチェックし、0 の場合は連結します。ただし、実際には、 where に(RAS)行があるかどうかをチェックしたいと思います。この Count() が > 0 の場合、条件が満たされています。FaitsSaillantsAxe = 'RAS'

IIF セグメントにサブクエリを実行できますSELECT COUNT(Index) FROM FaitsSaillants WHERE Axe = 'RAS' AND Utilisateur = FS1.Utilisateurか? RAS結果が 0 の場合、2 番目のフィールドの結果に追加します。そうでない場合はそのまま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;

集計関数 (iff) の一部ではない FS2.AxeCount に関するエラーが引き続き発生します。

私もこれを試しました:

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

FS3.IndexLEFT JOIN のため、対応するレコードがない場合は NULL です。テストじゃないの

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

...十分ですか?他の条件や結合も関係しているので、私にはわかりません。


UPDATE (コメントの要約)

最も内側のネストされた 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 句は、まさにこの句にリストされているフィールドによって行をグループ化します。グループ フィールドが類似しているいくつかの行が 1 つの行を形成するように凝縮されるため、通常、これにより行数が削減されます。これは、選択リストの残りのフィールド (グループ フィールドではない) の値を組み合わせる必要があることを意味します。これが集計関数の機能です。集計関数は

  • 平均(平均)
  • カウント
  • 最初の最後
  • 最小、最大 (最小、最大)
  • StDev、StDevP(標準偏差)
  • Var、VarP (分散)

SQL 集計関数 (アクセス)を参照してください。

これで、これを最も外側の選択リストに追加できます

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

FaitsSaillants テーブルで何を確認したいのか正確にはわかりません。あなたが言った:

FaitsSaillants に Ax = 'RAS' の行があるかどうかを確認したいと思います。この Count() が > 0 の場合、条件が満たされています。

しかし、あなたは次のようにも述べました:

SELECT COUNT(Index) FROM FaitsSaillants WHERE Ax = 'RAS' AND Employes.CIP = FS3.Utilisateur のようなもの

私の推測ではSELECT COUNT(Index) FROM FaitsSaillants WHERE Axe = 'RAS'、2 番目の SQL ステートメントではFROM、サブクエリの句で参照されていない 2 つのテーブルに結合しているためです。

DCountIIFステートメントでの使用はどうですか?

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 に答える