我试图在我的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。我然后总结它和GROUP BY我的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,我想看到课程的名称。但是,我还需要按主键分组,这需要我使用聚合函数。我不知道可以使用字符串执行此操作的聚合函数。
答案 0 :(得分:0)
考虑一个表或查询,如:
import os, inspect
main_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
print(main_path)
并查询:
+----------+------------+---------------+
| 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 | |
+----------+--------+---------+