Как я буду выполнять следующее требование, используя функцию SQL или запрос - PullRequest
0 голосов
/ 22 мая 2019

Как я напишу функцию sql для следующих требований

У меня есть временная таблица table1 со всеми столбцами типа int

                   table1

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

предположим, у меня есть другая временная таблица table2 с типом столбца nvarchar

                   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 Ответ

1 голос
/ 22 мая 2019

Как вы упомянули, вам нужна только логика разделения требуемых значений от объединенного значения, вы можете использовать SUBSTRING с помощью CHARINDEX для получения желаемых результатов. Некоторые примеры кодов приведены ниже -

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
...