2013-04-22 57 views
0

我遇到问题,需要SQL语句才能使用。说实话,当我谈到SQL时,我很绿,所以我试图尝试的尝试都来自我试图编辑的复制/粘贴代码,使其无法运行。所以我需要的是一个用于ACCESS报表的查询。
这里是什么样的数据是这样的:
使用IF THEN SQL查询生成报告


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个月内的金额加上任何其他事件中的“OccurrenceName”前6个月应该是他们的Tech Total。如果在过去6个月内没有“辅导”或“其他”事件发生,那么我需要对OccurrenceAmount进行总结,只是前6个月的滚动。

希望我解释得很好的场景很有意义。

编辑#1: 好了,我该数据预期输出应该是:


TechID  Total 
9991  4.5 
9999  9.0 
9998  2.0 

因此,大家可以看到,对于TechID 9991计算4.5,因为有一个 “教练”并且在过去6个月内没有任何事情发生。 9999会有9个,因为在过去的6个月里有7次教练,并且在之后的6个月内有2次教练,总数为9 9998有2次,因为该技术在过去6个月内没有任何教练或任何东西,因此总数为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。所以我试着把这个查询连接到你的第二个查询来获得总计到一个查询,并不能得到它的工作。

查询: 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

所以这些结果得到了最新的教练日期(如果有的话)和最近事件的日期,所以我需要基于两个条件,总结纪录:

  1. 如果有是在过去6个月内的教练/其他日期,需要从该线发生的总数加上在他们的教练/其他日期之后发生的任何其他日期
  2. 如果在过去6个月内没有发生过教练/其他日期,那么我需要发生的事情总数在过去6个月内。

靠近得到一个工作查询!感谢您的帮助

+0

“滚动前6个月”与“前6个月”和/或“前6个月”有什么不同?我想我不明白为什么无论“OccurenceName”是什么,你都无法用Tech对所有内容进行总和。 – 2013-04-22 14:26:11

+0

您可以发布您的预期输出以及您的样本数据吗?谢谢。 – GarethD 2013-04-22 14:32:43

+0

为了更加清晰,编辑。希望这有助于 – Zamael 2013-04-22 14:54:56

回答

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第二查询:

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; 

然后,在第二个查询

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; 

第一查询查找,如果它存在,并简单地在所述第二的最早日期为教练/其他在第一列中的最早日期。然后,在第二个查询中,我们假设Coaching/Other日期,除非它为空,那么我们默认为第二个日期。因为where为每个TechID动态约束日期,所以您可以将所有OccurenceAmt相加。

+0

我编辑了数据以更好地表示需要统计的内容。您的查询会返回正确的结果,但如果我的数据发生变化,我不清楚它是否可靠。这个数据库将开始拥有大量数据(超过120个“技术人员”),所以这将变得相当复杂。我试图抛出各种各样的场景,所以它从长远来看是有效的。 – Zamael 2013-04-22 16:52:07

+0

@Zamael感谢您对帖子的更新。如果你能澄清为什么你缩进237和239行而不是247行,我认为可以修改我的答案,给你你需要的东西。 – lance 2013-04-23 02:23:55

+0

应该显示缩进的行是:247,237,238,239,249,251 ......这些是应该计算的行 – Zamael 2013-04-23 17:47:11