【问题标题】:Convert from single column to multiple Column in sql Server在sql Server中从单列转换为多列
【发布时间】:2017-11-22 06:07:01
【问题描述】:

我已尝试使用以下代码。但我没有得到多列的输出。

select Name=stuff((select ','+ 
 name from Input t1 WHERE t1.Name=t2.name for xml path('')),1,9,''),NAME 
 =stuff((select ','+ 
 name from Input t1 WHERE t1.Name=t2.name for xml path('')),1,1,'')FROM 
 Input T2
 GROUP BY NAME

【问题讨论】:

    标签: sql sql-server multiple-columns


    【解决方案1】:

    我在 CTE 中分离了给定字符串的字符和数字部分,并在上面使用了一个简单的 group by 和 sum 子句。

    ;With CTE
    As
    (
        Select 
            Left(Names, 1) As String,
            SUBSTRING(Names, 2, Len(Names) - 1) As Number
        From SeparateColumns
    )
    Select 
        String,
        Sum(Cast(Number As Int)) As SumOfDigits
    From CTE
    Group By String
    Order By String;
    

    【讨论】:

    【解决方案2】:

    假设您的列中有单个字符,则以下代码有效

    CREATE TABLE #TEMP_SPLIT
    (VALUE VARCHAR(25))
    
    
    INSERT INTO #TEMP_SPLIT
    SELECT 'A10'
    UNION
    SELECT 'B20'
    UNION
    SELECT 'A30'
    UNION
    SELECT 'B40'
    UNION
    SELECT 'A10'
    UNION
    SELECT 'C1'
    
    
    SELECT c, sum(tot) 
    FROM
         (
            SELECT SUBSTRING(VALUE,1,1) c ,CONVERT(FLOAT,SUBSTRING(VALUE,2,LEN  (VALUE)-1)) Tot
             FROM #TEMP_SPLIT
    
          )T     
     GROUP BY C
    
     DROP TABLE #TEMP_SPLIT
    

    【讨论】:

      【解决方案3】:

      如果names列始终为指定格式,则使用LEFT函数提取字符部分和RIGHT函数提取数字部分并在子查询中使用这两个,并使用 GROUP BY 子句和 SUM 函数。

      查询

      select t.col_a as [string character], 
      sum(cast(t.col_b as int)) as [sum of digits] from(
          select left(names, 1) as col_a,
          right(names, len(names) - 1) as col_b
          from [your_table_name]
      ) t
      group by t.col_a;
      

      Find a example here

      【讨论】:

        【解决方案4】:

        如果names 始终采用这种指定格式,您可以将PATINDEX()SUBSTRING() 函数一起使用

        select A.CHAR [Strings], SUM(CAST(A.VALUE AS INT)) [Sum] from 
        (
            SELECT SUBSTRING(Name, 1, PATINDEX('%[^A-Z]%', Name)-1) [CHAR], SUBSTRING(Name, PATINDEX('%[0-9]%', Name), len(Name)) [VALUE] FROM <table>
        ) a GROUP BY A.CHAR
        

        【讨论】:

          【解决方案5】:

          这是使用子查询和group by 子句的简单解决方案:

          select [StringChar], SUM([Number]) from (
              select SUBSTRING(Names, 1, 1) as [StringChar],
                     convert(int, SUBSTRING(Names, 2, LEN(Names))) as [Number]
              from [Input]
          ) as a group by [StringChar]
          

          【讨论】:

            猜你喜欢
            • 2020-06-22
            • 1970-01-01
            • 1970-01-01
            • 2011-07-31
            • 1970-01-01
            • 2013-10-01
            • 1970-01-01
            相关资源
            最近更新 更多