Объединим результат стетс по горизонтали

Я знаю, что есть много вопросов на эту тему, но никто, похоже, не работает для моей проблемы

Короче говоря, я хочу объединить горизонтальное неизвестное количество наборов результатов, как в следующем примере

Результат 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
Другие вопросы по тегам