繁体   English   中英

使用IF THEN SQL查询生成报告

[英]Generating report using IF THEN SQL query

我在使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个月内有“教练”或“其他”的“ OccurrenceName”,则该金额加上前6个月内的其他任何事件都应作为其技术总计。 如果在过去的6个月内没有“教练”或“其他”事件发生,那么我需要对刚过去的6个月的OccurrenceAmount求和。

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

编辑#1:好的,我对此数据的预期输出应为:


TechID     Total
 9991       4.5
 9999       9.0
 9998       2.0

正如您所看到的,因为TechID 9991的计算值为4.5,因为发生了“教练”事件,而在过去的6个月中什么也没有发生。 9999将有9个,因为在过去6个月内有7个教练,此后又有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

因此,这些结果将获得最新的教练日期(如果有)和最新的活动日期,因此我需要根据2个条件对发生次数进行求和:

  1. 如果最近6个月内有教练/其他日期,则需要该行中的发生总数加上他们的教练/其他日期之后发生的其他日期
  2. 如果最近6个月内没有发生辅导/其他约会,那么我需要最近6个月内的培训总数。

靠近获取有效的查询! 谢谢你的帮助

@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;

第一个查询在第一列中查找“教练/其他”的最早日期(如果存在),并在第二列中找到最早的日期。 然后,在第二个查询中,我们假设“教练/其他”日期(除非它为null),否则默认为第二个日期。 由于where会动态限制每个TechID的日期,因此您可以将所有OccurenceAmt求和。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM