我如何使用sql函数或查询来达到以下要求

时间:2019-05-22 06:04:37

标签: sql sql-server stored-procedures sql-function

如何为以下要求编写sql函数

我有一个临时表table1,其中所有列都是int类型的

                   table1

scoreA |  scoreB | scoreC | classA |classB | classC |

假设我还有另一个同时具有nvarchar列类型的temp table2表

                   table2

        _______name__________myFormat_________
          ScoresOfAToC  |  1:10,2:20,3:30 |
           ClassOfAToC  |    1:4,2:5,3:6  |

我将如何拆分myFormat列,并将数据从表2插入表1,以便最终输出应如下所示:

                    table1

scoreA |  scoreB | scoreC | classA |classB | classC |
  10        20      30        4       5        6

1 个答案:

答案 0 :(得分:1)

如前所述,您只需要从组合值中分离出所需值的逻辑,就可以在CHARINDEX的帮助下使用SUBSTRING获得所需的结果。下面提供了一些示例代码-

SELECT name,
SUBSTRING(myFormat, (CHARINDEX(':',myFormat, 0))+1,(CHARINDEX(',',myFormat, 0))-((CHARINDEX(':',myFormat, 0))+1)),
SUBSTRING(myFormat, (CHARINDEX(':',myFormat,(CHARINDEX(':',myFormat,0))+1))+1,(CHARINDEX(',',myFormat, (CHARINDEX(',',myFormat, 0))+1))-((CHARINDEX(':',myFormat,(CHARINDEX(':',myFormat,0))+1))+1)),
SUBSTRING(myFormat,CHARINDEX(':',myFormat,CHARINDEX(':',myFormat,(CHARINDEX(':',myFormat,0))+1)+1)+1,LEN(myFormat))
FROM table2

此脚本的示例数据输出如下。希望您现在可以在脚本中调整此逻辑。

ScoresOfAToC    10  20  30
ClassOfAToC      4   5   6  

要使所有内容合而为一,请按如下所示应用PIVOT-

SELECT
SUBSTRING(ScoresOfAToC, (CHARINDEX(':',ScoresOfAToC, 0))+1,(CHARINDEX(',',ScoresOfAToC, 0))-((CHARINDEX(':',ScoresOfAToC, 0))+1)),
SUBSTRING(ScoresOfAToC, (CHARINDEX(':',ScoresOfAToC,(CHARINDEX(':',ScoresOfAToC,0))+1))+1,(CHARINDEX(',',ScoresOfAToC, (CHARINDEX(',',ScoresOfAToC, 0))+1))-((CHARINDEX(':',ScoresOfAToC,(CHARINDEX(':',ScoresOfAToC,0))+1))+1)),
SUBSTRING(ScoresOfAToC,CHARINDEX(':',ScoresOfAToC,CHARINDEX(':',ScoresOfAToC,(CHARINDEX(':',ScoresOfAToC,0))+1)+1)+1,LEN(ScoresOfAToC)),
SUBSTRING(ClassOfAToC, (CHARINDEX(':',ClassOfAToC, 0))+1,(CHARINDEX(',',ClassOfAToC, 0))-((CHARINDEX(':',ClassOfAToC, 0))+1)),
SUBSTRING(ClassOfAToC, (CHARINDEX(':',ClassOfAToC,(CHARINDEX(':',ClassOfAToC,0))+1))+1,(CHARINDEX(',',ClassOfAToC, (CHARINDEX(',',ClassOfAToC, 0))+1))-((CHARINDEX(':',ClassOfAToC,(CHARINDEX(':',ClassOfAToC,0))+1))+1)),
SUBSTRING(ClassOfAToC,CHARINDEX(':',ClassOfAToC,CHARINDEX(':',ClassOfAToC,(CHARINDEX(':',ClassOfAToC,0))+1)+1)+1,LEN(ScoresOfAToC)),
ScoresOfAToC,
ClassOfAToC
FROM
(
SELECT name,myFormat FROM table2
)AS A
PIVOT
(
    MAX(myFormat) FOR Name in ([ScoresOfAToC],[ClassOfAToC])
)PVT