-3

我有以下数据:

column1        column2
   1             aaa
   1             bbb
   2             ccc
   2             ddd
   2             eee

预期的输出应该是每个 column1 类型的一行,其中包含所有 column2 数据,如下所示:

column1,   column2
   1,      aaa|bbb
   2,      ccc|ddd|eee

我怎样才能得到这个输出?

我正在使用下面的查询来获取这些数据。

select sub_id,listagg(pack_name, '|')  within group(order by sub_id) package_name 
from Recon_Droppacks_Migration group by sub_id;

col1:sub_id
col2:pack_name
table:Recon_Droppacks_Migration
4

5 回答 5

4

您没有指定您正在使用的 RDBMS。以下是您将如何在各种 DBMS 中执行此操作。

MySQL,您将使用GROUP_CONCAT()

SELECT column1, GROUP_CONCAT(column2 SEPARATOR ' | ') column2
FROM table1
GROUP BY column1

请参阅带有演示的 SQL Fiddle

在 SQL Server 中,您将使用FOR XML PATH

select 
  t1.col1,
  STUFF((SELECT distinct ' | ' + col2
              from table1 t2
              where t1.col1 = t2.col1
            FOR XML PATH(''), TYPE

            ).value('.', 'NVARCHAR(MAX)') 
        ,1,3,' ') col2
from table1 t1
group by t1.col1

请参阅带有演示的 SQL Fiddle

在 Oracle 中,您可以使用LISTAGG()

select "col1", 
  listagg("col2", ' | ') within group(order by "col1") col2
from table1
group by "col1"

请参阅带有演示的 SQL Fiddle

在 Postgresql 中,您可以使用string_agg()

SELECT column1, string_agg(column2, ' | ') col2
FROM Table1
GROUP BY column1;

请参阅带有演示的 SQL Fiddle

编辑,根据您的评论,您将要使用:

select sub_id, listagg(pack_name, ' | ') within group(order by sub_id) package_name 
from Recon_Droppacks_Migration 
group by sub_id;
于 2012-10-15T12:57:33.453 回答
1

使用递归查询:

SELECT *, 
       Row_number() 
         OVER ( 
           PARTITION BY COLUMN1 
           ORDER BY COLUMN1 ) rn 
INTO   #TEMP1 
FROM   TABLE1; 

WITH RECUR 
     AS (SELECT *, 
                Cast(COLUMN2 AS VARCHAR(MAX)) AS full_text 
         FROM   #TEMP1 
         WHERE  RN = 1 
         UNION ALL 
         SELECT t1.*, 
                Cast(t2.FULL_TEXT + ' | ' + t1.COLUMN2 AS VARCHAR(MAX)) 
         FROM   #TEMP1 t1 
                INNER JOIN RECUR t2 
                        ON t1.COLUMN1 = t2.COLUMN1 
                           AND t1.RN = t2.RN + 1) 
SELECT t1.COLUMN1, 
       t1.FULL_TEXT 
FROM   RECUR t1 
       INNER JOIN (SELECT Max(RN) rn, 
                          COLUMN1 
                   FROM   RECUR 
                   GROUP  BY COLUMN1) t2 
               ON t1.COLUMN1 = t2.COLUMN1 
                  AND t1.RN = t2.RN 

在此处查看完整示例

于 2012-10-15T12:53:30.553 回答
1

使用 MySQL:使用GROUP_CONCAT

SELECT column1, GROUP_CONCAT(column2 SEPARATOR ' | ') as column2
    FROM Table1 
    GROUP BY column1

请参阅 SQLFiddle 演示

使用 SQL Server:

SELECT distinct column1, column2 = 
    STUFF((SELECT ' | ' + column2
           FROM Table1 b 
           WHERE b.column1 = a.column1 
          FOR XML PATH('')), 1, 2, '')
FROM Table1 a
GROUP BY column1;

请参阅 SQLFiddle 演示

于 2012-10-15T12:49:44.053 回答
0

这个解决方案T-SQL 是否有一个聚合函数来连接字符串?工作正常,因为它不会在 xml 字符上失败。

declare @Temp_Table table (column1 bigint, column2 nvarchar(max))

insert into @Temp_Table (column1, column2)
select 1, 'aaa' union all
select 1, 'bbb' union all
select 2, 'ccc' union all
select 2, 'ddd' union all
select 2, 'eee'

select distinct
    t1.column1,
    stuff(
        (
            select
                ' | ' + t2.column2
            from @Temp_Table as t2
            where t2.column1 = t1.column1
            order by t2.column2 for xml path(''), type
        ).value('.', 'nvarchar(max)')
    , 1, 3, '')
from @Temp_Table as t1

您还可以编写游标并使用变量技巧

于 2012-10-15T12:54:41.820 回答
-1

请尝试下面给出的查询

SELECT concat(CONVERT(column1,char(8))," , ") AS id,group_concat(CONVERT(column2, CHAR(20)) separator '|') AS result FROM `tablename` WHERE 1 group by column1

这里concat用于附加,字段column1CONVERT用于将其转换为字符串,因为它更好地处理字符串。并使用给定的 saperatorGROUP_CONCAT附加所有结果。column1

谢谢

于 2012-10-15T13:06:02.367 回答