使用IF THEN SQL查询生成报告

时间:2013-04-22 14:21:25

标签: sql ms-access

我遇到问题需要将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个月内有“教练”或“其他”的“发生名称”,那么该数额加上前6个月内的任何其他事件应该是他们的技术总数。如果在过去6个月内没有“教练”或“其他”事件发生,那么我需要将OccurrenceAmount加起来只是前6个月的滚动。

希望我的解释方案很有意义。

编辑#1: 好的,这个数据的预期输出应该是:


TechID     Total
 9991       4.5
 9999       9.0
 9998       2.0

正如您所看到的,对于TechID 9991计算4.5,因为在过去的6个月中发生了“教练”事件并且没有任何内容。 9999将有9个,因为在过去的6个月内有7个教练和另外两个教练,使得总数达到9. 9998有2个因为该技术在过去6个月内没有教练或任何东西所以总数为2。 / p>

编辑#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个月内的总发生次数。
  3. 更接近获得有效的查询!谢谢你的帮助

1 个答案:

答案 0 :(得分: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加起来。