Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 基于ID将MS Access行数据转换为列_Ms Access - Fatal编程技术网

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匹配
  • 其中,
    SpeakerID
    小于当前SpeakerID
  • 计算此集合中
    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会抛出错误)。

会对您有所帮助吗?