在Microsoft Access中实现SQL查询的Pivot(行转列)操作
Microsoft Access SQL 实现客户角色行转列需求
表结构
Table_1(客户角色定义表)
| Id | Name |
|---|---|
| 1 | Guest |
| 2 | Registered |
Table_2(客户-角色关联表)
| ID | Customer_Id | CustomerRole_Id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 2 |
| 5 | 3 | 1 |
| 6 | 4 | 2 |
实现方案
方案1:使用Access专属交叉表查询(TRANSFORM)
这是Access中实现行转列最简洁的方式,利用TRANSFORM关键字直接生成交叉表:
TRANSFORM FIRST(t1.Name) AS RoleValue SELECT t2.Customer_Id FROM Table_1 t1 INNER JOIN Table_2 t2 ON t1.Id = t2.CustomerRole_Id GROUP BY t2.Customer_Id PIVOT 'Name_' & t1.Name;
TRANSFORM FIRST(t1.Name):指定取每个客户对应角色的名称(因每个客户-角色组合唯一,FIRST/LAST/MAX效果一致)GROUP BY t2.Customer_Id:按客户ID分组,确保每个客户一行PIVOT 'Name_' & t1.Name:将角色名称拼接成目标列名(如Name_Guest)
方案2:通用SQL聚合+条件判断(兼容更多场景)
如果需要更灵活的列控制,或者习惯标准SQL写法,可以用IIF结合聚合函数实现:
SELECT t2.Customer_Id, MAX(IIF(t1.Name = 'Guest', t1.Name, NULL)) AS Name_Guest, MAX(IIF(t1.Name = 'Registered', t1.Name, NULL)) AS Name_Registered FROM Table_1 t1 INNER JOIN Table_2 t2 ON t1.Id = t2.CustomerRole_Id GROUP BY t2.Customer_Id;
IIF函数判断当前角色是否匹配目标列,匹配则返回角色名称,否则返回NULLMAX聚合函数过滤NULL值,保留客户实际拥有的角色名称
两种方案都能输出需求格式:每个Customer_Id对应一行,角色作为列展示,无对应角色则显示空值。
内容的提问来源于stack exchange,提问作者Christian Brune
相关产品推荐
相关产品推荐

