访问有关pivot的Sql

时间:2014-05-22 12:54:13

标签: sql vba

我现在有四张桌子。

  1. StuInfo
  2. ActInfo
  3. ActAttendance
  4. ActLateArriveAndEarlyLeave
  5. 对于类型,1 =迟到,2 =提前休假

    是否可以使用一个sql语句生成这样的查询?

    C3:E4是存储一个人在活动中所拥有的总时间的单元格。

    或者如果不可能,我想将最终结果导出到Excel文件。 我怎么能在VBA中做到这一点? 非常感谢。如果我没有足够清楚地解释,请告诉我。

2 个答案:

答案 0 :(得分:0)

数据透视表是您需要的,遗憾的是我无法找到从Access导出一个作为平面查询的方法。它只会将其导出为ex​​cel中的数据透视表。此查询将为您提供正确的数据。然后你必须从它创建一个支点

SELECT DISTINCT 
  StuInfo.StuName AS Name, 
  StuInfo.Stu_No, 
  DateDiff("h",IIf([AcctLateAriveAndEarlyLeave].[Type]=1,[AcctLateAriveAndEarlyLeave].[Time],[AcctInfo].[sTime]),IIf([AcctLateAriveAndEarlyLeave].[Type]=2,[AcctLateAriveAndEarlyLeave].[Time],[AcctInfo].[eTime])) AS AttendedFor, Format([AcctInfo].[sTime],"mm/dd/yyyy") AS OnDate
FROM ((StuInfo LEFT JOIN AcctAttendance ON StuInfo.Stu_No = AcctAttendance.Stu_No) LEFT JOIN AcctInfo ON AcctAttendance.[Act_S/N] = AcctInfo.[S/N]) LEFT JOIN AcctLateAriveAndEarlyLeave ON StuInfo.Stu_No = AcctLateAriveAndEarlyLeave.Stu_No;

然后,您可以创建一个类似于此

的数据透视表

enter image description here

显然,如果你想要明确的时间以外的东西,你必须稍微改变一下。

答案 1 :(得分:0)

交叉表查询可以正常工作。但是,我需要更多关于日期字段下的值计算的信息。在我的例子中,我假设它们是Max(Type)

TRANSFORM Max(Type) AS MaxOfType  
SELECT StuInfo.SteName, StuInfo.Stu_No FROM StuInfo       
INNER JOIN ActLateArriveAndEarlyLeave ON StuInfo.Stu_No = ActLateArriveAndEarlyLeave.Stu_No      
GROUP BY StuInfo.Ste_No, StuInfo.SteName      
PIVOT Format(ActLateArriveAndEarlyLeave.TimeValue, 'short date');