2016-06-19 7 views
2

開発者(Table:ApplixCalls)で発生したバグを追跡し、ログに記録されたバグ(表:対応)に関するすべての対応を追跡できるデータベースを作成しました。Microsoft AccessのSELECT DISTINCT count()

私は、対応がないか、私たちからの連絡しかないバグの数を見ることができるカウントを作成しようとしています。これは、これまでのところ、私はこのSQLを持って

に、我々は更新のために、私たちの開発者を追いかけすべき場所などを確認するために私たちに可視性を与える必要があります。

SELECT DISTINCT Count(ApplixCalls.OurRef) AS CountOfOurRef 
    FROM ApplixCalls LEFT JOIN Correspondence ON ApplixCalls.OurRef = Correspondence.OurRef 
    HAVING (((Correspondence.OurRef) Is Null) 
     AND ((ApplixCalls.Position)<>'Closed')) 
    OR ((ApplixCalls.Position)<>'Closed') 
     AND ((Correspondence.[SBSUpdate?])=True); 

私はこの部分は我々が持っているあらゆる機会をカウントしていることを発見しています私はOurRefがユニークであり、それは私たちだけからアップデート持って1カウントすることを必要とする更新、送られた:理にかなって

OR ((ApplixCalls.Position)<>'Closed') 
     AND ((Correspondence.[SBSUpdate?])=True); 

うまくいけばを...

はaroun方法はありますこれは?あなたはあなたに応え、すべての要素をカウントしている場合

答えて

2

MSアクセスはcount(distinct)をサポートしていません。あなたの場合は、サブクエリを使用することができます。また、クエリは機能しません。おそらくこれは、あなたが意図するものである:

SELECT COUNT(*) 
FROM (SELECT ApplixCalls.OurRef 
     FROM ApplixCalls LEFT JOIN 
      Correspondence 
      ON ApplixCalls.OurRef = Correspondence.OurRef 
     WHERE (((orrespondence.OurRef Is Null) AND (ApplixCalls.Position) <> 'Closed')) OR 
       (ApplixCalls.Position <> 'Closed') AND (Correspondence.[SBSUpdate?] = True)) 
      ) 
     GROUP BY ApplixCalls.OurRef 
    ) as x; 

変更:

  • あなたがいないGROUP BYHAVING句を持っています。私はこれがWHEREであるべきだと思います(私はあなたが意図しているロジックについて100%確信していませんが)。
  • SELECT DISTINCTは、SELECT . . . GROUP BYに置き換えられています。
  • COUNT(DISTINCT)はサブクエリでCOUNT(*)になりました。

EDIT:

あなたのコメントの記述に基づいて:

SELECT COUNT(*) 
FROM (SELECT ApplixCalls.OurRef 
     FROM ApplixCalls LEFT JOIN 
      Correspondence 
      ON ApplixCalls.OurRef = Correspondence.OurRef 
     WHERE (((orrespondence.OurRef Is Null) AND (ApplixCalls.Position) <> 'Closed')) OR 
       (ApplixCalls.Position <> 'Closed') AND (Correspondence.[SBSUpdate?] = True)) 
      ) 
     GROUP BY ApplixCalls.OurRef 
     HAVING SUM(IIF(Correspondence.[SBSUpdate?] = False, 1, 0)) = 0 
    ) as x; 
+0

ありがとうゴードン、これは私が探しているものに非常に近いです。最後の残りの部分は、対応が[SBSUpdate?] = Falseの場合を無視する必要があるということです。これは開発者からの応答があることを示しているので、追跡する必要はありません!現在、ApplixCallの対応が2 trueと1 falseの場合、結果では依然として選択されています。 –

0

あなたが重複した結果を除去するかの明確な... DISTINCT必要はありません条件付ける

SELECT Count(distinct ApplixCalls.OurRef) AS CountOfOurRef 
FROM ApplixCalls LEFT JOIN Correspondence ON ApplixCalls.OurRef = Correspondence.OurRef 
WHERE (((Correspondence.OurRef) Is Null) 
    AND ((ApplixCalls.Position)<>'Closed')) 
OR ((ApplixCalls.Position)<>'Closed') 
    AND ((Correspondence.[SBSUpdate?])=True); 
+0

おかげで、私がいる問題は、私は重複を取得していますということです。私の質問キーの2番目の部分は、「私たちがアップデートを送信したときに、この部分がカウントされていることがわかりました。 ApplixCalls.OurRefには、それに関連するいくつかの対応があるかもしれません。たとえば、OurRef '9999'には3つの連絡先がリンクされており、そのうちのすべてが私たちから送られてきました(SBSUpdate?= true)。これは1とカウントする必要があります。現時点では3とカウントされます。 –

+0

答え...あなたはカウントが必要なようです(別個...)私はまた持っていることを変えます – scaisEdge

0

あなたが持つ句を使用している理由を私は理解できません。私はこの質問があなたに必要なものを満たしてくれることを願っています。

SELECT DISTINCT Count(ApplixCalls.OurRef) AS CountOfOurRef 
     FROM ApplixCalls LEFT JOIN Correspondence ON ApplixCalls.OurRef = Correspondence.OurRef 
     HAVING (((Correspondence.OurRef) Is Null) 
      AND ((ApplixCalls.Position)<>'Closed')) 
     OR ((ApplixCalls.Position)<>'Closed') 
      AND ((Correspondence.[SBSUpdate?])=True);