【问题标题】:I need SQL query for this data situation in Oracle [closed]我需要对 Oracle 中的这种数据情况进行 SQL 查询 [关闭]
【发布时间】:2012-10-15 12:42:15
【问题描述】:

我有以下数据:

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

【问题讨论】:

  • 并发布一些工作查询,不要紧是不正确的,是一个起点
  • select 1 as column1, 'aaa|bbb' as column2 union all select 2 as column1, 'ccc|ddd|eee' as column2
  • @MahmoudGamal:是的,这很明显,但是至少没有尝试解决问题的问题通常不会得到认真的回应。

标签: sql oracle


【解决方案1】:

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

MySQL,你将使用GROUP_CONCAT():

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

SQL Fiddle with Demo

在 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 with Demo

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

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

SQL Fiddle with Demo

在 Postgresql 中你可以使用string_agg():

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

SQL Fiddle with Demo

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

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

【讨论】:

  • 上述查询出现错误“ORA-00923:未在预期位置找到 FROM 关键字”。请帮助获得这个。
  • @Niranjan 我不知道你为什么会收到这个错误,看看这个演示,我的原始示例和你的版本都可以工作——sqlfiddle.com/#!4/a2289/2这是你正在运行的确切查询吗?跨度>
【解决方案2】:

使用递归查询:

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 

查看完整示例here

【讨论】:

    【解决方案3】:

    使用 MySQL:使用 GROUP_CONCAT

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

    See SQLFiddle Demo

    使用 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;
    

    See SQLFiddle Demo

    【讨论】:

      【解决方案4】:

      这个解决方案Does T-SQL have an aggregate function to concatenate strings? 工作正常,因为它不会在 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
      

      你也可以写一个游标和使用变量技巧

      【讨论】:

        【解决方案5】:

        请尝试下面给出的查询

        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 用于将, 附加到column1 字段,CONVERT 用于将其转换为字符串,因为它更适用于字符串。并且GROUP_CONCAT 使用给定的saperator 附加特定column1 的所有结果。

        谢谢

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-25
          • 2016-11-24
          • 2021-02-09
          • 1970-01-01
          相关资源
          最近更新 更多