在sql Server中从单列转换为多列

时间:2017-11-22 06:07:01

标签: sql sql-server multiple-columns

enter image description here enter image description here

我尝试使用以下代码。但我没有根据多列获得输出。

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

5 个答案:

答案 0 :(得分:3)

我已经在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;

答案 1 :(得分:1)

如果PATINDEX()始终采用此指定格式,则可以SUBSTRING()使用names功能

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

答案 2 :(得分:1)

如果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

答案 3 :(得分:1)

假设您的列中包含单个字符,则以下代码可以使用

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

答案 4 :(得分:1)

这是使用子查询和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]