【问题标题】:Join n result stets horizontal水平连接 n 个结果
【发布时间】:2019-01-02 18:35:53
【问题描述】:

我知道关于这个主题有很多问题,但似乎没有人能解决我的问题

简而言之,我想水平合并未知数量的结果集,如下例所示

结果 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

“名称”列在所有结果中完全相同。

觉得你们可以帮忙吗?

【问题讨论】:

  • 如果不在运行时动态构建,我认为这是不可能的
  • unknown number of result sets 这是否意味着,您有未知数量的表?
  • 此结果由 SELECT 在 while 块中提供
  • 你能标记你正在使用的数据库吗?
  • 您使用的是什么关系型数据库? MySQL、SQL-Server、Oracle、SQLite、PostGres?

标签: mysql sql pivot full-outer-join


【解决方案1】:

你会使用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 语句。

【讨论】:

    【解决方案2】:

    快速存储过程来动态构建您的查询字符串并执行它。您可以使用第一个输入 @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多