2017-05-15 6 views
0

私はこれを過度に複雑にしていると思います。SQLで1つに分割する

私はSQLで幻想的ではないので、時々クエリビルダを使用する必要があります。

私が達成しようとしています何

私は私のクエリは私を見せたい:

管理者名管理者名が表に

ある回の

数等しい紛争の数TRUE

紛争を合計時間で割ったマネージャーは、次のとおりです。 Eテーブル私はこれで間違っているつもりです

現在のSQL

SELECT DISTINCT tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager, Count(tbl_Quality_Disputes.Manager) AS CountOfManager, [Decision]/[Manager] AS Success_Rate 
    FROM tbl_Quality_Disputes 
    GROUP BY tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager, tbl_Quality_Disputes.Decision, [Decision]/[Manager] 
    HAVING (((tbl_Quality_Disputes.Decision)="Approved")); 

?事前に

おかげ

+0

スキーマを提供できる場合は、簡単に手助けできます。 –

+0

GROUP BYのときにDISTINCTを選択します。 – jarlh

+0

HAVING句は、集約関数の条件用です。 – jarlh

答えて

1

のは、あなたが必要とするグループ化から始めましょうを提供し、クエリの下に使用してみてください。あなたの結果では、各マネージャの行が必要なので、それは間違いなくDecisionです。

次に、WHERE句の決定にフィルタリングを適用しないのは、カウント(*)から行を削除するためですが、HAVINGは集約フィールドの条件を意味するため、それをそこに置くことはできません。集計の1つでフィルタリングする必要があるため、他の集計でフィルタリングする必要がないため、必要な場所で集計内にcaseを使用できます。

最後に、成功率の計算は、ManagerフィールドとDecisionフィールドではなく、カウントに基づいて計算する必要があります。

その意味は明確ではないが、あなたはそれがサイドノートとして

SELECT Manager, 
     COUNT(*) AS CountOfManager, 
     SUM(case when Decision = "Approved" then 1 else 0 end) AS Decision, 
     SUM(case when Decision = "Approved" then 1 else 0 end)/Count(*) AS Success_Rate 
FROM tbl_Quality_Disputes 
GROUP BY Manager 

に収まることができるように、それは少し私は私のクエリを編集します説明している場合、私はテーブルを削除して、私はLoggedDateフィールドを無視単一のテーブルを使用する場合は不要なので、クエリをより冗長にするため、すべてのフィールドの接頭辞の名前を使用します。 2つ以上のテーブルを使用する場合は、カラム名の前に接頭辞を付けることをお勧めしますが、テーブルにエイリアスを付けてすべてをコンパクトにすることができます。

編集

LoggedDateは同じマネージャーのすべての行で同じになりますので、あなたはGROUP BYに追加したり、MINまたはMAX(私は後者のオプションを好むとそれを集約するか、Iそれをより堅牢に見出す)。

エラーは、おそらくAccess doesn't support the CASE expression(ごめんなさい、それを知らなかったため)です。私はこれをIIFに置き換えました。

SELECT Manager, 
     MAX(LoggedDate) AS MaxLoggedDate, 
     COUNT(*) AS CountOfManager, 
     SUM(IIF(Decision = "Approved", 1, 0)) AS CountOfDecision, 
     SUM(IIF(Decision = "Approved", 1, 0))/Count(*) AS Success_Rate 
FROM tbl_Quality_Disputes 
GROUP BY Manager 
+0

詳しい返信ありがとうございます - それを感謝します。 LoggedDateは、マネージャーがテーブルに追加された日付です。私はこれを持っているので、日付範囲でフィルタリングすることができます。 私はあなたのSQLを使用しましたが、SUMで文法エラー(演算子がありません)を受け取りました(Decision = "Approved"、次に1 else 0 end) – dmorgan20

+0

もう一度助けてくれてありがとうございます。その別のエラーをスローする:SELECTステートメントにスペルミスまたは不足している予約済みの作業名または引数名が含まれています – dmorgan20

+0

これはエラーの原因となる行であると私は理解しています:SUM(IIF(Decision = "Approved"、1、0))/ Count *)AS Success_Rate – dmorgan20

0


SELECT tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager, 
Count(tbl_Quality_Disputes.Manager) AS CountOfManager, [Decision]/[Manager] AS Success_Rate 
    FROM tbl_Quality_Disputes 
WHERE tbl_Quality_Disputes.Decision="Approved" 
    GROUP BY tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager, 
tbl_Quality_Disputes.Decision, [Decision]/[Manager]; 

が親切にサンプルデータと期待出力

+0

条件式のデータ型の不一致 - 残念ながら私はオフィスのIMとして、他のWebサイトは制限されています – dmorgan20

+0

Decision and Managerは数値データ型ですか? –

+0

返信ありがとうございます - データ型は次のとおりです。テキスト – dmorgan20

関連する問題