使用MS Access,我有两个交叉表查询来汇总我的数据。一个可以让我按位置和财政季度获得数据行的总数;另一个查询可让我按位置和财政季度获得符合条件的百分比。
以下示例(为方便起见,对它们进行了简化)。
Location Period CountIt
Blue FY13-Q3 Yes
Orange FY13-Q1 No
Blue FY14-Q1 No
Orange FY13-Q1 Yes
然后,我有一个交叉表Yes
从该CountIt
列获取值的百分比,另一个交叉表显示每个会计季度的总计数。
TRANSFORM Sum(IIf(qryA.CountIt Like "Yes",1,0))/Count(qryA.CountIt) AS PercentYes
SELECT qryA.[Location]
FROM qryA
GROUP BY qryA.[Location]
PIVOT qryA.[Period];
## Crosstab Output
Location FY13-Q1 FY13-Q2 FY13-Q3 FY13-Q4 FY14-Q1
Blue 12% 15% 13.2% 19% 15%
Orange 9% 12% 1% 18% 12%
TRANSFORM Count(qryA.CountIt) AS FiscalCount
SELECT qryA.[Location]
FROM qryA
GROUP BY qryA.[Location]
PIVOT qryA.[Period];
## Crosstab that display total count by location and Fiscal quarter
Location FY13-Q1 FY13-Q2 FY13-Q3 FY13-Q4 FY14-Q1
Blue 102 111 54 124 122
Orange 91 321 122 158 129
我想创建一个组合表,以显示“是”的百分比和总数
FY13-Q1 FY13-Q2 FY13-Q3 FY13-Q4 FY14-Q1
Location Per% Tot Per% Tot Per% Tot Per% Tot Per% Tot
Blue 12% 102 15% 111 13.2% 54 19% 124 15% 122
Orange 9% 91 12% 321 1% 122 18% 158 12% 129
这可能吗?如您所见,我的行标题是会计期间,并且当我添加更多数据时,我将获得更多行(它们是动态的)...我不确定如何将它们合并到期望的结果中。
谢谢!
由于FY13-Q1,FY13-Q2,FY13-Q3,FY13-Q4,FY14-Q1似乎是完整的列表,您可以使用 IN
TRANSFORM Sum(aTable.aNumber) AS SumOfaNumber
SELECT aTable.aText, Sum(aTable.aNumber) AS [Total Of aNumber]
FROM aTable
GROUP BY aTable.aText
PIVOT "FY" & Format(ADate,"yy") & "-Q" & Format([ADate],"q")
In ("FY13-Q1","FY13-Q2","FY13-Q3","FY13-Q4","FY14-Q1");
您可以使用查询设计窗口中的“列标题”属性来添加标题,或者直接在SQL视图窗口中键入标题。
请注意,如果省略IN形式的值,即使有数据也不会显示该列。
如果在VBA中构建查询,则可以更改标题列表以适合要使用的四分之一,或者省略格式(FY13-01等),因此MS Access返回Qtr 1,Qtr 2等。
然后,您可以按照任何适合的方式加入数据:
SELECT atable_crosstab.[FY13-Q1],
atable_crosstab2.[FY13-Q1] AS [Per Q1],
atable_crosstab.[FY13-Q2],
atable_crosstab2.[FY13-Q2] AS [Per Q2],
atable_crosstab.[FY13-Q3],
atable_crosstab2.[FY13-Q3] AS [Per Q3],
atable_crosstab.[FY13-Q4],
atable_crosstab2.[FY13-Q4] AS [Per Q4]
FROM atable_crosstab
INNER JOIN atable_crosstab2
ON atable_crosstab.atext = atable_crosstab2.atext;
但是,您将无法拥有跨两列运行的标题。
这是VBA中的草图
Sub BuildCrosstab()
Dim sBase As String
Dim iQtr, iYear, iStartYear, iEndYear
Dim sIn As String
Dim CurDate As Date
Dim qdf As QueryDef
sBase = "TRANSFORM Sum(aTable.aNumber) AS SumOfaNumber " _
& "SELECT aTable.aText, Sum(aTable.aNumber) AS [Total Of aNumber] " _
& "FROM aTable " _
& "GROUP BY aTable.aText " _
& "PIVOT ""FY"" & Format(ADate,""yy"") & ""-Q"" & Format([ADate],""q"") In "
iStartYear = Year(Date) - 1
iEndYear = Year(Date)
For iYear = iStartYear To iEndYear
CurDate = DateSerial(iYear, 1, 1)
For iQtr = 1 To 4
If CurDate <= Date Then
sIn = sIn & ",""" & "FY" & Format(CurDate, "yy") & "-Q" _
& Format(CurDate, "q") & """"
CurDate = DateAdd("q", 1, CurDate)
End If
Next
Next
sIn = "(" & Mid(sIn, 2) & ")"
''This query exists
Set qdf = CurrentDb.QueryDefs("ATable_Crosstab")
qdf.SQL = sBase & sIn
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句