Ms access 基于ID将MS Access行数据转换为列
我有一个扬声器表,其中存储的数据如下:Ms access 基于ID将MS Access行数据转换为列,ms-access,Ms Access,我有一个扬声器表,其中存储的数据如下: SessionID || SpeakerID 1 || 54 1 || 897 2 || 63 2 || 897 2 || 444 我正在尝试创建一个查询,该查询将显示数据,以便每个SessionID返回1行,每个SpeakerID返回一列,如下所示: SessionID || SpeakerID 1 || SpeakerID 2 || Spe
SessionID || SpeakerID
1 || 54
1 || 897
2 || 63
2 || 897
2 || 444
我正在尝试创建一个查询,该查询将显示数据,以便每个SessionID返回1行,每个SpeakerID返回一列,如下所示:
SessionID || SpeakerID 1 || SpeakerID 2 || SpeakerID 3
1 || 54 || 897 ||
2 || 63 || 897 || 444
SessionID || SpeakerID 2 || SpeakerID 3
1 || 897 ||
2 || || 444
我看到了一篇老帖子,上面提到了这一点,我已经玩了很长一段时间了,但没能让它发挥作用。
我得到的结果如下所示:
SessionID || SpeakerID 1 || SpeakerID 2 || SpeakerID 3
1 || 54 || 897 ||
2 || 63 || 897 || 444
SessionID || SpeakerID 2 || SpeakerID 3
1 || 897 ||
2 || || 444
你能告诉我我错过了什么吗?很明显,它跳过了我的一些演讲者,只显示了最后的演讲者,但我不确定如何获得我需要的结果。删除“Last()”片段只会抛出一个错误
TRANSFORM Last(SpeakersCustomerSort_qry.ID) AS SpeakerDetails
SELECT SpeakersCustomerSort_qry.SessionID
FROM SpeakersCustomerSort_qry
GROUP BY SpeakersCustomerSort_qry.SessionID
PIVOT "Speaker " & (DCount("[SessionID]","[SpeakersCustomerSort_qry]","SessionID=" & [SessionID])+1);
如果您的表名为
Speakers
,则您要查找的SQL为:
TRANSFORM Last(Speakers.SpeakerID) AS SpeakerDetails
SELECT Speakers.SessionID
FROM Speakers
GROUP BY Speakers.SessionID
PIVOT "Speaker " & (
DCount("[SpeakerID]",
"[Speakers]",
"[SessionID] = " & [SessionID] & " AND [SpeakerID] < " & [SpeakerID]
) + 1
);
检查结果时,您应该看到:
SessionID | SpeakerID | SpeakerNumber
--------- | --------- | -------------
1 | 54 | Speaker 1
1 | 897 | Speaker 2
2 | 63 | Speaker 1
2 | 897 | Speaker 3
2 | 444 | Speaker 2
SpeakerNumber
表达式正在对Speakers
表中的每一行执行以下计算:
- 查找
中的所有行,其中Speakers
与当前SessionID匹配SessionID
- 其中,
小于当前SpeakerIDSpeakerID
- 计算此集合中
的值(=行数)SpeakerID
- 将
添加到该计数中1
- 在结果前加上
Speaker
演讲者
中的第一行尝试它,其中当前的SessionID
是1
,当前的SpeakerID
是54
:
- 查找
:SessionID=1的行集
SessionID | SpeakerID --------- | --------- 1 | 54 1 | 897
- 在这些行中,找到一组行,其中
:无行李>SpeakerID<54
- 计算此集合中的行数:
0
0+1=1
- 前缀:
扬声器1
SpeakerNumber
中的这些值来自何处
因此,我们这里有一种方法,计算每个会话的发言人数,按发言人数的升序,从1开始计算
回到交叉表
想象一下,将上面的3列结果交叉制表,将SpeakerNumber
的每个值作为列标题,将SessionID
的每个值作为行标题,并对每个单元格中相应的SpeakerIDs
进行汇总。这就是顶部的交叉表SQL所做的
最后一个问题是:我们如何总结对应于SpeakerNumber
和SessionID
的每个组合的speakerrid
?这就是Last([SpeakerID])
aggregate函数的作用。它只是说:
- 对于
和SpeakerNumber
的每个组合SessionID
- 查找所有匹配的
扬声器
- 返回该列表中的最后一个
SpeakerNumber
/SessionID
组合只匹配一个SpeakerID,因此这仅给出相应的SpeakerID
的值。在这种情况下,使用First()
aggregate函数将得到相同的结果
您必须在交叉列表中使用某种聚合函数,因为理论上,每个因子组合可能有多个匹配值(这就是为什么删除Last()
函数时Access会抛出错误)。会对您有所帮助吗?