gpt4 book ai didi

sql - 将两个带有动态行标题的交叉表合并为一个

转载 作者:行者123 更新时间:2023-12-05 01:05:36 24 4
gpt4 key购买 nike

使用 MS Access,我有两个交叉表查询汇总了我的数据。一个让我按位置和财政季度得到数据行的总数;另一个查询让我得到符合地点和财政季度条件的百分比。

下面的例子(为了问题,它们被简化了)。

qryA:原始汇总表

Location    Period      CountIt    
Blue FY13-Q3 Yes
Orange FY13-Q1 No
Blue FY14-Q1 No
Orange FY13-Q1 Yes

然后我有一个交叉表,它获得了 Yes 的百分比来自 CountIt 的值列和另一个显示每个财政季度的总数。

交叉表 #1 - 百分比
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%

交叉表 #2 - 数一数
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 View 窗口中键入。

请注意,如果省略 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

关于sql - 将两个带有动态行标题的交叉表合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21261987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com