Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将行连接到列中(对于XML路径(“”)和递归CTE为否)-SQL Server 2012_Sql_Sql Server_Tsql_String Aggregation - Fatal编程技术网

将行连接到列中(对于XML路径(“”)和递归CTE为否)-SQL Server 2012

将行连接到列中(对于XML路径(“”)和递归CTE为否)-SQL Server 2012,sql,sql-server,tsql,string-aggregation,Sql,Sql Server,Tsql,String Aggregation,我手头有一个非常特殊的问题 简介:我在一个数据库中有两列需要分组连接,在MySQL中,我只需使用group_CONCAT来获得所需的结果,在SQL Server 2017中,我会使用STRING_AGG,我遇到的问题是SQL Server 2012中没有此功能 现在,在正常情况下,我将使用XML路径来获得解决方案,这是不可行的,因为我在第三个源应用程序中从编辑器运行查询,我得到的错误是 FOR XML路径不能在游标内使用 为了讨论这个问题,我们假设使用这个函数是完全不可能的 我尝试过使用递归CT

我手头有一个非常特殊的问题

简介:我在一个数据库中有两列需要分组连接,在MySQL中,我只需使用group_CONCAT来获得所需的结果,在SQL Server 2017中,我会使用STRING_AGG,我遇到的问题是SQL Server 2012中没有此功能

现在,在正常情况下,我将使用XML路径来获得解决方案,这是不可行的,因为我在第三个源应用程序中从编辑器运行查询,我得到的错误是

FOR XML路径不能在游标内使用

为了讨论这个问题,我们假设使用这个函数是完全不可能的

我尝试过使用递归CTE,但是,由于执行时间的原因,它是不可行的,UNION占用了太多的资源,无法正确执行。我正在使用数据进行报告

由于相同的敏感度,我不会发布数据的屏幕截图,想象一下只有两列,一列的id是多个相同的id,另一列的数据需要连接到某个字符串。目标是将第二列与第一列中所有相同id的第二列连接起来,显然在过程中使其不同

例如: 输入:

col1 col2 1A 1b 2A 3 c 输出:

col1 col2 1 a/b 2A 3 c
有人对如何做到这一点有创意吗?

您的示例输出似乎是错误的,因为“a/b”的值应该是2

请尝试以下操作:

declare @t table (col1  int, col2 varchar(100))
insert into @t select 1, 'a'
insert into @t select 2, 'b'
insert into @t select 2, 'a'
insert into @t select 3, 'c'

declare @final_table table (col1  int, col2 varchar(100), col2_all varchar(1000))
insert into @final_table (col1, col2)
select * from @t

declare @col2_all varchar(1000)
declare @Name sysname

update  @final_table 
SET @col2_all = col2_all = COALESCE(CASE COALESCE(@Name, '') 
                                        WHEN col1 THEN @col2_all + '/' + col2
                                        ELSE col2 END, ''), 
                                    @Name = col1;

select col1, col2_grouped = MAX(col2_all)
from @final_table
group by col1
使用CTE:


请参阅dbfiddle。

您的示例输出似乎有误,因为“a/b”应为值2

请尝试以下操作:

declare @t table (col1  int, col2 varchar(100))
insert into @t select 1, 'a'
insert into @t select 2, 'b'
insert into @t select 2, 'a'
insert into @t select 3, 'c'

declare @final_table table (col1  int, col2 varchar(100), col2_all varchar(1000))
insert into @final_table (col1, col2)
select * from @t

declare @col2_all varchar(1000)
declare @Name sysname

update  @final_table 
SET @col2_all = col2_all = COALESCE(CASE COALESCE(@Name, '') 
                                        WHEN col1 THEN @col2_all + '/' + col2
                                        ELSE col2 END, ''), 
                                    @Name = col1;

select col1, col2_grouped = MAX(col2_all)
from @final_table
group by col1
使用CTE:


请参阅dbfiddle。

如果您知道需要连接在一起的最大值数,可以使用条件聚合:

select col1,
       stuff( concat(max(case when seqnum = 1 then '/' + col2 end),
                     max(case when seqnum = 2 then '/' + col2 end),
                     max(case when seqnum = 3 then '/' + col2 end),
                     max(case when seqnum = 4 then '/' + col2 end),
                     max(case when seqnum = 5 then '/' + col2 end)
                    ), 1, 1, ''
            ) as col2s                     
from (select t.*, 
             row_number() over (partition by col1 order by col2) as seqnum
      from t
     ) t
group by col1;
您可以使用以下方法获得最大数量:

select top (1) count(*)
from t
group by col1;

如果您知道需要连接在一起的最大值数,则可以使用条件聚合:

select col1,
       stuff( concat(max(case when seqnum = 1 then '/' + col2 end),
                     max(case when seqnum = 2 then '/' + col2 end),
                     max(case when seqnum = 3 then '/' + col2 end),
                     max(case when seqnum = 4 then '/' + col2 end),
                     max(case when seqnum = 5 then '/' + col2 end)
                    ), 1, 1, ''
            ) as col2s                     
from (select t.*, 
             row_number() over (partition by col1 order by col2) as seqnum
      from t
     ) t
group by col1;
您可以使用以下方法获得最大数量:

select top (1) count(*)
from t
group by col1;


为什么你要对你的问题做一个简单的介绍,其中包括你的解决方案的一部分,这显然不是你要走的路,因为你在这里问了一个关于它的问题?请提供一些假的?样本数据和所需输出。在文本中,而不是在图片中!我提供介绍是因为这是一个显而易见的答案,如果我没有提到它,我会得到它作为一个答案,如果我已经尝试过,没有理由用不起作用的答案污染帖子。你不能创建一个视图,用于XML路径和应用程序中的“从视图中选择”吗?不幸的是,无法访问数据库。我所拥有的只是查询数据库的在线视图。为什么您要简要介绍您的问题,其中包括部分解决方案,这显然不是解决问题的方法,因为您在这里提出了一个问题?请提供一些假的?样本数据和所需输出。在文本中,而不是在图片中!我提供介绍是因为这是一个显而易见的答案,如果我没有提到它,我会得到它作为一个答案,如果我已经尝试过,没有理由用不起作用的答案污染帖子。你不能创建一个视图,用于XML路径和应用程序中的“从视图中选择”吗?不幸的是,无法访问数据库。我所拥有的只是查询数据库的在线视图。是的,太棒了!我在某处看到了联合解决方案,我只是不知道如何实现它。有一个问题,我不能在在线编辑器中使用insert into,当我想到它时,关键字被禁止是有意义的,这可以用CTE-s编写吗?我确实在网上找到了这个,为给定的解决方案编写了它,但执行时间太长,我在考虑更多的是在CTE中使用您的解决方案。@BorisJovanovic动态sql如何?函数和过程都已过时。@BorisJovanovic确实有效?是的,太棒了!我在某处看到了联合解决方案,我只是不知道如何实现它。有一个问题,我不能在在线编辑器中使用insert into,当我想到它时,关键字被禁止是有意义的,这可以用CTE-s编写吗?我确实在网上找到了这个,为给定的解决方案编写了它,但执行时间太长,我在考虑更多的是在CTE中使用您的联合解决方案。@BorisJovanovic动态sql如何?函数和过程已过时。@BorisJovanovic确实有效。你需要聚合。这是一个很好的解决方法,我已经考虑过了,目前最大数量是21,但我需要在某个时候动态地拉它。如果我找不到最佳解决方案,我可能会尝试一下。谢谢,因为它处于次优状态,我认为没有比这更好的解决方案了。非常感谢。你需要聚合。这是一个很好的解决方法,我已经考虑过了,目前最大数量是21,b
但我需要它在某个点被动态拉动。如果我找不到最佳解决方案,我可能会尝试一下。谢谢,因为它处于次优状态,我认为没有比这更好的解决方案了。非常感谢。