SQL:将重复行中的不同列数据转换为 MS Access 中的列

问题描述

所以我正在处理来自有点混乱的 csv 文件的数据。很多重复的行,最后两个值构成了该列中应该是单独的标题和数据,如下所示:

ID 姓名 日期 field4 field5
1 约翰 21-03-23 味道 草莓
1 约翰 21-03-23 位置 厨房
2 21-04-18 味道 石灰
2 21-04-18 位置 地下室

到目前为止,我只使用 INSTER INTO 语句清理了 Access 中的数据,因为所有具有相同主键的重复行都将被忽略。像这样的查询

  query GetUser($id: ID!) {
    getUser(id: $id){
      id
      project
    }
  }

,它返回如下内容

ID 姓名 日期 field4 field5
1 约翰 21-03-23 味道 草莓
2 21-04-18 味道 石灰

但是,现在我需要将 field4 和 field5 中的所有不同值转换为新列,这样数据就不会丢失。像这样:

ID 姓名 日期 味道 位置
1 约翰 21-03-23 草莓 厨房
2 21-04-18 石灰 地下室

如何在 sql 中完成此操作?

解决方法

使用条件聚合:

select id,name,date,max(iif(field4 = "Flavour",field5,null)) as flavour,max(iif(field4 = "Location",null)) as Location
from t
group by id,date;

这假设您知道结果集中所需的列。如果没有,您需要以某种方式生成查询字符串以进行更动态的查询。

,

您可以使用自联接:

SELECT D.ID,D.[Name],D.[Date],D.Field5 AS Flavour,D1.Field5 AS Location
FROM tblData AS D1 INNER JOIN tblData AS D 
    ON D1.[Date] = D.[Date] 
    AND D1.[Name] = D.[Name] 
    AND D1.ID = D.ID
WHERE 
    D.Field4="Flavour" 
    AND D1.Field4="Location";

请注意,NameDate 是 Access 中的保留字,因此我将它们放在方括号中 2 - 在深入了解数据库设计之前,您现在应该重命名这些字段。

问候,