0

必要な方法で SQL ステートメントを機能させるのに問題があります。正直なところ、私は SQL に関してはかなりグリーンなので、私が試みた試みは、機能するように編集しようとしたコピー/貼り付けコードから来ており、実行されていません。したがって、ACCESS でレポートに使用するクエリが必要です。
データは次のようになります。


ID   TechID   OccurrenceDate                     OccurrenceName          OccurrenceAmt
 247      9991     Friday, February 15, 2013          Coaching                4.50        
242   9991     Friday, February 08, 2013          Con't Occurrence        0.00      
241   9991     Thursday, February 07, 2013        Unscheduled Absense     1.00      
240   9991     Wednesday, February 06, 2013       Shift Int less 2 hrs    0.50
243   9991     Monday, February 04, 2013          Unscheduled Absense     1.00
246   9991     Monday, January 21, 2013           Unscheduled Absense     1.00
245   9991     Wednesday, January 16, 2013        Con't Occurrence        0.00
244   9991     Tuesday, January 15, 2013          Unscheduled Absense     1.00
 239      9999     Friday, February 08, 2013          Unscheduled Absense    1.00
 237      9999     Wednesday, February 06, 2013       Unscheduled Absense    1.00   
 238      9999     Saturday, February 02, 2013        Coaching               7.00
236   9999     Tuesday, September 11, 2012        Other                   6.00
235   9999     Tuesday, September 11, 2012        Other                   0.00
228   9999     Thursday, August 23, 2012          Unscheduled Absense     1.00
227   9999     Friday, August 10, 2012            Unscheduled Absense     1.00
226   9999     Wednesday, August 08, 2012         Con't Occurrence        0.00
223   9999     Wednesday, February 29, 2012       Unscheduled Absense     1.00
 249      9998     Saturday, February 02, 2013        Unscheduled Absense    1.00
 251      9998     Monday, January 21, 2013           Unscheduled Absense    1.00

したがって、基本的に、過去 6 か月間に「Coaching」または「Other」の「OccurrenceName」がある場合、その金額に過去 6 か月間のその他の発生を加えたものが Tech Total になります。過去 6 か月間に「コーチング」または「その他」の発生がない場合は、過去 6 か月のローリングのみの OccurrenceAmount を合計する必要があります。

うまくいけば、私の非常によく説明されたシナリオが理にかなっています。

編集 #1: わかりました、このデータの期待される出力は次のようになります。


TechID     Total
 9991       4.5
 9999       9.0
 9998       2.0

ご覧のとおり、TechID 9991 は 4.5 と計算されます。これは、過去 6 か月間に「コーチング」が発生し、それ以降何も発生していないためです。9999 は、過去 6 か月間に 7 回のコーチングがあり、それ以降 2 回のコーチングがあったため、9 になります。9998 は、過去 6 か月間にコーチングなどがないため、合計が 2 になるため、2 になります。

編集 #2: したがって、カウントする必要がある行は、インデントされた行だけです。9999 については、7 回のコーチングと、さらに 2 回の定期的なオカレンスがあり、彼の合計は 9 回になりました。それはより明確ですか?

編集#3: さて、もう少し道を進んだ。
@lance - 試行錯誤を通じて、私は近づいています...今のところこれを持っていますが、動作させることはできません:

SELECT tblEmployeeData.TechID, tblEmployeeData.LName, tblEmployeeData.FName, Sum(tblOccurrence.OccurrenceAmt), Last(tblOccurrence.CoachingDate) AS LastOfCoachingDate, tblEmployeeData.SupLName FROM tblEmployeeData RIGHT JOIN tblOccurrence ON tblEmployeeData.TechID = tblOccurrence.TechID GROUP BY tblEmployeeData.TechID, tblEmployeeData.LName, tblEmployeeData.FName, tblEmployeeData.SupLName HAVING (((tblOccurrence.OccurrenceAmt))=IIf([tblOccurrence].[CoachingDate]="",[tblOccurrence].[OccurrenceDate] Between Date() And DateAdd('m',-6,Date()),IIf([tblOccurrence].[CoachingDate]<=DateAdd('m',-6,Date()),[tblOccurrence].[OccurrenceDate] Between Date() And DateAdd('d',[tblOccurrence].[CoachingDate],Date()))));

編集 #4: このクエリは、私が作業を開始した「最良の」最初のクエリです。すべての従業員データを取得してから、MaxCoaching と MaxDate に入力します。そのため、このクエリを 2 番目のクエリに接続して合計をクエリに追加しようとしましたが、機能しません。

クエリ: SELECT tblEmployeeData.TechID, tblEmployeeData.LName, tblEmployeeData.FName, Max(tblOccurrence.CoachingDate) AS LastCoachingDate, Max([OccurrenceDate]) AS MaxDate, tblEmployeeData.SupLName FROM tblEmployeeData LEFT JOIN tblOccurrence ON tblEmployeeData.TechID = tblOccurrence.TechID GROUP BY tblEmployeeData.SupLName, tblEmployeeData.TechID, tblEmployeeData.LName, tblEmployeeData.FName

したがって、これらの結果は最新のコーチング日 (ある場合) と最新のイベント日を取得するため、2 つの条件に基づいてオカレンスを合計する必要があります。

  1. 過去 6 か月以内にコーチング/その他の日付がある場合は、その行の合計回数に加えて、コーチング/その他の日付の後に発生したその他の日付が必要です。
  2. 過去 6 か月以内にコーチングやその他の日付が発生していない場合は、過去 6 か月以内の合計回数が必要です。

機能するクエリの取得に近づきます! ご協力いただきありがとうございます

4

1 に答える 1

0

@Zamael あなたの質問と説明が理解できれば、9998 の合計が 9 になる理由は、9 月の日付が 6 か月以上前であり、OccurenceAmt が 2 である別の項目があるためです。テーブル。

それが正しいと仮定すると、次の SQL を使用してクエリを作成することをお勧めします。

Select TechID, 
       SUM(IIF([OccurenceName] in ('Coaching','Other'),1,0)) as CoachingOtherCount,     
       SUM(IIF([OccurenceName] in ('Coaching','Other'),OccurenceAmt,0)) as CoachingAmt, 
       SUM(IIF(IIF([OccurenceName] in ('Coaching','Other'),0,OccurenceAmt))) as MiscAmt
From TableName
Where OccurenceDate > = DateAdd("m",-6,Date())
Group By TechID;

次に、次の SQL を使用して 2 つ目のクエリを作成します。

select TechID,
       IIF(Nz(CoachingOtherCount,0) > 0, CoachingAmt, MiscAmt) as SumOccurenceAmt
from Query1;

編集 1 - 明確化後 私が今理解していることは次のとおりです。 ステップ 1: 過去 6 か月の「コーチング」または「その他」を見つけます。存在する場合は 2 に、存在しない場合は 3 に進みます。 ステップ 2: ステップ 1 の最も古いもの以降に発生するすべての行を合計します。 ステップ 3: 過去 6 か月のすべての行を合計します。

これが探しているものであれば、次のコードが機能します。

SELECT TechID, 
       MIN(IIF([OccurrenceName] in ('Coaching','Other'),OccurrenceDate,NULL)) AS MinCoachingOtherDate, 
       MIN([OccurrenceDate]) AS MinDate
FROM tblOccurrence
WHERE OccurrenceDate >= DateAdd("m",-6,Date())
GROUP BY TechID;

次に、2 番目のクエリで

Select tbo.TechID,
       SUM([OccurrenceAmt]) as Amount

From tblOccurrence tbo
     LEFT JOIN QUERY1 q on q.techid = tbo.techid

WHERE tbo.OccurrenceDate >= IIF(q.MinCoachingOtherDate IS NULL, q.MinDate, q.MinCoachingOtherDate)

GROUP BY tbo.TechID;

最初のクエリは、存在する場合は最初の列でコーチング/その他の最も早い日付を検索し、2 番目の列で単純に最も早い日付を検索します。次に、2 番目のクエリでは、null でない限りコーチング/その他の日付を想定し、デフォルトで 2 番目の日付に設定します。where は各 TechID の日付を動的に制約するため、OccurenceAmt をすべて合計できます。

于 2013-04-22T16:34:27.137 に答える