访问:将多行合二为一,但显示文本
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 101 和 Baking 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;
【讨论】:
以上是关于访问:将多行合二为一,但显示文本的主要内容,如果未能解决你的问题,请参考以下文章