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

0

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

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

Результат 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

Столбец "Имя" точно совпадает во всем результате.

Думаете, вы, ребята, могли помочь?

  • 0
    Без динамического построения во время выполнения я не думаю, что это возможно
  • 1
    unknown number of result sets означает, что у вас есть неизвестное количество таблиц?
Показать ещё 7 комментариев
Теги:
pivot
full-outer-join

2 ответа

0

Быстрая хранимая процедура для динамической сборки строки запроса и ее выполнения. Вы можете управлять выполнением с помощью первого ввода @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
0

Вы должны использовать 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, основанного на той же логике.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню