当前位置: 首页 > 面试题库 >

将一列拆分为多列,但数据会有所不同

丁沛
2023-03-14
问题内容

我的数据库中有一组行,如下所示:

Mr Joe Bloggs
Joe Bloggs
Joe Jim Bloggs
Joe Jim David Bloggs
Mr Joe Jim Bloggs
Mr Joe Jim David Bloggs

需要的输出:

Title | First Name | Middle Name | Surname
------------------------------------------
Mr | Joe | x | Bloggs
x | Joe | x | Bloggs
x | Joe | Jim | Bloggs
x | Joe | Jim David | Bloggs
Mr | Joe | Jim | Bloggs
Mr | Joe | Jim David | Bloggs

这将在SQL存储过程中运行。我需要的是在通过CURSOR和4个变量循环更新数据库中的4列时生成的输出。但是正如您所看到的,数据在1列中并且有所不同。

我发现很难理解执行此操作的最佳方法,并希望获得您的帮助。需要帮助请叫我。

我有类似的问题,但我觉得这些并不能给我我所需要的完整答案,或者我认为它不能回答我的问题:

  • 将列字符串拆分为多个列字符串
  • 将选择结果(一列)分成多列
  • SQL单列拆分为多个列
  • 如何在SQL中将列值拆分为不同的列
  • SQL查询将一列分为两列
  • 表列拆分为sql中的两列?

编辑:

    --Temporary Table to Merge the full name together in order to split by comma. Each split will have a unique record but with the same address information for each name. 
    CREATE TABLE #TempOutput
    (
        ClientReference varchar(MAX),
        Prefix varchar(MAX),
        Reference int,
        MergedFullName varchar(MAX),
        FormatName varchar(MAX),
        Title varchar(MAX),
        FirstName varchar(MAX),
        MiddleName varchar(MAX),
        Surname varchar(MAX)
    )

    DECLARE @Ref varchar(MAX)
    DECLARE @Prefix varchar(MAX)
    DECLARE @Reference int
    DECLARE @MergedName varchar(MAX)
    DECLARE @FormatName varchar(MAX)
    DECLARE @Title varchar(MAX)
    DECLARE @FirstName varchar(MAX)
    DECLARE @MiddleName varchar(MAX)
    DECLARE @Surname varchar(MAX)

    DECLARE ExtraNameSplitCursor CURSOR FOR
        SELECT 
            [Client Reference], 
            Prefix,
            Reference,
            CASE 
                WHEN LEFT(Surname,3) = 'Mr,' THEN (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Replace(Surname,'Mr,',''))
                WHEN LEFT(Surname,4) = 'Mrs,' THEN (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Replace(Surname,'Mrs,',''))
                ELSE (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Surname) 
            END AS [Merged Full Name]
        FROM #StartResults

    OPEN ExtraNameSplitCursor

    FETCH NEXT FROM ExtraNameSplitCursor INTO @Ref, @Prefix, @Reference, @MergedName
    WHILE @@FETCH_STATUS = 0
        BEGIN
            INSERT INTO #TempOutput (ClientReference, Prefix, Reference, MergedFullName) 
            SELECT @Ref, @Prefix, @Reference, GUID, FROM dbo.fn_SPLIT_LIST_STRING (@MergedName)

            --SELECT CASE 
            --  WHEN @FormatName.GUID = 'Mr ' THEN @Title = "Mr"
            --  WHEN LEFT(@MergedName,4) = 'Mrs ' THEN @Title = "Mrs" 
            --  WHEN LEFT(@MergedName,5) = 'Miss ' THEN @Title = "Miss"
            --  WHEN LEFT(@MergedName,3) = 'Ms ' THEN @Title = "Ms"
            --  WHEN LEFT(@MergedName,3) = 'Dr ' THEN @Title = "Dr"
            --  WHEN LEFT(@MergedName,4) = 'Rev ' THEN @Title = "Rev"
            --  WHEN LEFT(@MergedName,5) = 'Lord ' THEN @Title = "Lord"
            --  ELSE @Title = "' 
            --END AS Title,
            --CASE 
            --  WHEN MID(@MergedName,2,1) = " ' THEN @FirstName = '' ELSE @FirstName = CHARINDEX(' ', MergedFullName + ' ') FROM #TempOutput AS FirstName

            FETCH NEXT FROM ExtraNameSplitCursor INTO @Ref, @Prefix, @Reference, @MergedName, @FlatNo, @HouseName, @HouseNo, @Street, @District, @PostTown, @County, @PostCode
        END

    CLOSE ExtraNameSplitCursor
    DEALLOCATE ExtraNameSplitCursor

    --Select statement for temporary table
    SELECT 
        ISNULL(ClientReference,'') AS ClientReference,
        ISNULL(Prefix,'') AS Prefix,
        ISNULL(Reference,'') AS Reference,
        ISNULL(MergedFullName,'') AS MergedFullName, 
        ISNULL(Title,'') AS Title,
        ISNULL(FirstName,'') AS FirstName,
        ISNULL(MiddleName,'') AS MiddleName,
        ISNULL(Surname,'') AS Surname

    FROM #TempOutput Result
    ORDER BY ClientReference
    for xml auto

    --Drop all temporary tables
    DROP TABLE #TempOutput
    DROP TABLE #StartResults

END

问题答案:

我已经解决了我的问题,并感谢您提供的线索和帮助。

我基本上添加了第二个游标,它执行以下操作:

  • 抓取“合并全名”字段并放入一个临时变量。
  • 通过运行案例语句来检查标题,以检查先生,夫人等,否则在“标题”中输入空白字符串。
  • 更新标题修剪合并全名的标题
  • 通过RIGHT(@TempName,CHARINDEX(’‘,REVERSE(@TempName))-1)检查该姓氏,并假定这是该姓氏。
  • 更新姓氏修剪并将其替换为合并的全名
  • 通过LEFT(@TempName,CHARINDEX(’‘,
    @TempName +’‘)-1)在左边检查名字

  • 更新名字修饰并将其替换为合并的全名

  • 其他任何东西都放在中间名中。

有点长,但是在我的数据库中99.9%的情况下,它的格式完全正确。

如果您想要上面的代码,请告诉我。

谢谢您的时间。



 类似资料:
  • 问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue

  • 如何将这列列表拆分为两列? 期望的结果:

  • 我的问题是如何将一列拆分为多个列。我不知道为什么 不起作用。 例如,我想将“df_test”更改为“df_test2”。我看到了很多使用熊猫模块的例子。还有别的办法吗?提前感谢您。 df_test2

  • 我正在Spark 3.0.0上执行Spark结构流的示例,为此,我使用了twitter数据。我在Kafka中推送了twitter数据,单个记录如下所示 2020-07-21 10:48:19|1265200268284588034|RT@narendramodi:与@IBM首席执行官@ArvindKrishna先生进行了广泛的互动。我们讨论了几个与技术相关的主题,…|印度海得拉巴 在这里,每个字段

  • 正在尝试从csv文件中读取数据,将每行拆分为各自的列。 但是,当某个列本身带有逗号时,我的正则表达式就失败了。 例如:a, b, c,"d, e, g,", f 我想要的结果是: 也就是5列。 下面是用逗号分隔字符串的正则表达式am ,(?=(?:“[^”]?(?:[^”])*)),(?=[^”](?:,),$) 但是它对少数字符串失败,而对其他字符串有效。 我想要的是,当我使用pyspark将c

  • 问题内容: 我有一个如下所示的Pandas数据框: 我正在尝试将列表分成几列,如下所示: 没有值的列(因为列表没有那么长)用空白或NaN或其他内容填充。 我见过类似的回答这一个和其他类似的给它,而他们在长度相等的名单工作,他们都扔错误,当我尝试使用的长度不等的列表中的方法。有什么好办法吗? 问题答案: 尝试: 包括 我们可以通过以下方式确定所有格式: