访问:将多行合二为一,但显示文本

Posted

技术标签:

【中文标题】访问:将多行合二为一,但显示文本【英文标题】:Access: Combining multiple rows into one, but show text 【发布时间】:2017-11-07 14:46:57 【问题描述】:

我正在尝试通过在我的 SQL 语句中使用 GROUP BY 从多行中形成单行。

问题是,我正在处理的原始数据包含我不需要的数据,并且所有字段都填充了文本字符串。

例如,

ID COURSE
01 Baking 101
01 Driving 102
01 Writing 101
02 Baking 102
02 Writing 101

我不需要“写作”,只需要“烘焙”和“驾驶”。所以我希望我的数据是这样的:

ID Baking     Driving
01 Baking 101 Driving 102
02 Baking 102 -

我通过查看它们是否包含相关关键字来选择记录,因为我的原始数据源包含所有课程的课程历史,而不仅仅是我关注的课程。同一门课程的课程拼写可能会有所不同。

到目前为止,我使用 IIf 语句在关键字存在时返回 1,如果关键字不存在则返回 0。然后我对它进行求和并按我的 ID(个人标识符)分组。所以我的桌子有点像这样。

ID Course1 Course2 Course3 Course4 Course5
01    1       0       0       1       0
02    0       1       1       0       0

如果记录包含某个关键字,我希望我的查询显示记录,同时仍将所有相关记录分组并截断为一行。

GROUP BY 函数不能这样做(afaik),因为它不知道如何处理文本字符串(即它不知道要显示哪条记录),这就是为什么我使用 IIf 来生成number 然后 Sum 以允许 GROUP BY。有没有办法让我将数字转换回文本(即满足我的 IIf 语句的文本)

对于无法提供数据的实际样本,我深表歉意,但很遗憾,我无法分享这些公司数据。

编辑:

当我说拼写不同时,我的意思是这样的:

1.Baking 101 Cse
2.Baking 101 Course
3.Baking-101 Cse

所以到目前为止,我的 SELECT 语句是这样的

SELECT Courses.CourseName,
Sumiif((Courses.CourseName Like "*Baking*",1,0) AS BAKING
FROM Courses
GROUP BY Courses.PersID

这是相当简单的,因为我有超过 1 门课程要处理。

所以我面临的问题是我想在字段中显示实际数据,而不是 IIf 函数的结果。即,我想查看课程名称,而不是 1。但是,我还需要按主键分组,这需要我使用聚合函数。我不知道可以使用字符串执行此操作的聚合函数。

【问题讨论】:

您能否发布您的查询和您“真正”想要显示的结果,即使它是虚拟数据。这将有助于我们进一步了解您的需求。 在您当前的问题中,没有办法看到 Baking 101Baking 102 之间的关系,因此无法知道它们属于同一列。如果您有一个包含所有列名以及属于该列的值的表,则可以使用数据透视轻松解决此问题。就目前的状态,你解决不了。 “拼写可以变化”是什么意思——只是数字后缀发生了变化?课程名称和部分确实应该在单独的字段中。但是,使用字符串操作函数来解析查询中的部分。 【参考方案1】:

考虑一个表或查询,例如:

+----------+------------+---------------+
| CourseID | CourseName | CourseSection |
+----------+------------+---------------+
|       01 | Baking     |           101 |
|       01 | Driving    |           102 |
|       01 | Writing    |           101 |
|       02 | Baking     |           102 |
|       02 | Writing    |           101 |
+----------+------------+---------------+

并查询:

TRANSFORM First(Courses.CourseSection) AS FirstOfCourseSection
SELECT Courses.CourseID
FROM Courses
WHERE (((Courses.CourseName)<>"Writing"))
GROUP BY Courses.CourseID
PIVOT Courses.CourseName;

输出:

+----------+--------+---------+
| CourseID | Baking | Driving |
+----------+--------+---------+
|       01 |    101 |     102 |
|       02 |    102 |         |
+----------+--------+---------+

如果您的课程名称在拼写上不太一致,并且名称和部分实际上在一个字段中,但部分后缀是一致的,则模拟如下交叉表:

SELECT Courses.CourseID, Max(IIf(InStr([CourseName],"Baking")>0,Right([CourseName],3),Null)) AS Baking, 
Max(IIf(InStr([CourseName],"Driving")>0,Right([CourseName],3),Null)) AS Driving
FROM Courses
GROUP BY Courses.CourseID;

【讨论】:

以上是关于访问:将多行合二为一,但显示文本的主要内容,如果未能解决你的问题,请参考以下文章

将多行中的多个文本字段分组为一列[重复]

将两个访问表合二为一

防止在 EditText 上输入键,但仍将文本显示为多行

将多行数据列转置为一列

从不同功能但相同类访问数组元素

尝试在 MDTextField (KivyMD) 中访问后未显示用户文本