Объединим результат стетс по горизонтали
Я знаю, что есть много вопросов на эту тему, но никто, похоже, не работает для моей проблемы
Короче говоря, я хочу объединить горизонтальное неизвестное количество наборов результатов, как в следующем примере
Результат 1:
Name |sum1 |sum2
________________
name1| 0.5 |0.1
name2| 0.6 |0.2
Результат 2:
Name |sum1 |sum2
________________
name1| 1.5 |0.7
name2| 1.6 |0.9
.
.
.
Результат n:
Name |sum1 |sum2
________________
name1| 7.5 |9.7
name2| 8.6 |5.9
В заключение:
Name |sum1 |sum2| sum1 | sum2|.......| sum1|sum2
________________________________________
name1| 0.5 |0.1 | 1.5 | 0.7 |.......| 7.5 |9.7
name2| 0.6 |0.2 | 1.6 | 0.9 |.......| 8.6 |5.9
Столбец "Имя" абсолютно одинаков во всем результате.
Думаешь, вы, ребята, могли бы помочь?
2 ответа
Вы бы использовали join
:
select r1.name, r1.sum1, r1.sum2, r2.sum1, r2.sum2, r3.sum1, r3.sum2
from result1 r1 join
result2 r2
on r1.name = r2.name join
results r3
on r1.name = r3.name
Вам нужно будет продолжить это для каждого набора результатов.
Теперь, имея неизвестное количество наборов результатов, это усложняет ситуацию. Это просто требует создания динамического оператора SQL, основанного на той же логике.
Быстрая хранимая процедура для динамического построения строки запроса и ее выполнения. Вы можете контролировать выполнение с первого ввода @in_run_query
,
CREATE PROCEDURE dynamic_sql_query
@in_run_query INT
, @in_count_results_sets INT
AS
BEGIN
IF @in_count_results_sets IS NULL
EXIT
IF TRY_CONVERT(INT,@in_count_results_sets) IS NULL
EXIT
IF @in_count_results_sets < 2
BEGIN
SELECT 'Counter must be between 2 and 100'
EXIT
END
IF @in_count_results_sets > 100
BEGIN
SELECT 'Build a better database'
EXIT
END
DECLARE @sql_string NVARCHAR(MAX) , @counter INT = 2
SET @select = 'SELECT r1.name, r1.sum1, r1.sum2'
SET @from = 'FROM result1 AS r1'
LOOP:
SET @prefix = 'r' + CAST(@counter AS String)
SET @full_name = 'result' + CAST(@counter AS String)
-- select
SET @select = @select + ', ' + @prefix + '.name, ' + @prefix + '.sum1, ' + @prefix + '.sum2'
-- from
SET @from = @from + ' join ' + @full_name + ' AS ' + @prefix + ' on r1.name = ' + @prefix + '.name'
IF @counter = @in_count_results_sets
GOTO AppendStrings
@counter = @counter + 1
GOTO LOOP
AppendStrings:
SET @sql_string = @select + ' ' + @from + ';'
IF @in_run_query <> 1
BEGIN
SELECT @sql_string
EXIT
END
EXECUTE sp_executesql @sql_string
END