【问题标题】:SQL: converting distinct column data in duplicate rows into columns in MS AccessSQL:将重复行中的不同列数据转换为 MS Access 中的列
【发布时间】:2021-08-25 14:09:22
【问题描述】:

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

ID Name Date field4 field5
1 John 21-03-23 Flavour Strawberry
1 John 21-03-23 Location Kitchen
2 Jane 21-04-18 Flavour Lime
2 Jane 21-04-18 Location Basement

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

INSERT INTO b (ID, Name, Date, field4, field5)
SELECT a.ID, a.Name, a.Date, a.field4, a.field5
FROM a;

,它返回如下内容:

ID Name Date field4 field5
1 John 21-03-23 Flavour Strawberry
2 Jane 21-04-18 Flavour Lime

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

ID Name Date Flavour Location
1 John 21-03-23 Strawberry Kitchen
2 Jane 21-04-18 Lime Basement

这如何在 SQL 中完成?

【问题讨论】:

    标签: sql csv ms-access data-cleaning


    【解决方案1】:

    使用条件聚合:

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

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

    【讨论】:

    • 这真的很奇怪,因为当我尝试使用包含三个重复行的示例表时它可以工作,但是当我使用我处理 att 工作的表之一时,每个条目有 13 个重复行,这一切都会崩溃并开始跳过其中两列中的数据。
    • @NimaDT 。 . .听起来像 Name 这样的东西的值看起来相同但实际上不同。
    • 是的,一列有一个数字部门代码,然后两列将该代码与下划线和经理姓名连接起来。有解决方法吗?我试图跳过带有部门代码的列 (no "max(iif())")...
    【解决方案2】:

    您可以使用自联接:

    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 括在方括号中 - 您现在应该重命名这些字段,然后再深入了解数据库的设计。

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2011-03-22
      相关资源
      最近更新 更多