Sql 在oracle中使用varchar字段时出现错误

Sql 在oracle中使用varchar字段时出现错误,sql,oracle11g,Sql,Oracle11g,我有一张桌子 id和value都是varchars >> id "value" ----------------------- a 1 a 2 a 5 a 6 a 7 a 8 b 4 b 5 b 6

我有一张桌子 id和value都是varchars

>> id          "value"
-----------------------
   a             1
   a             2
   a             5
   a             6
   a             7
   a             8
   b             4
   b             5
   b             6
   b             9
我只是想看看输出

value    Result
-----------------
a        1-2,5,6-8
b        4-6,9
我尝试使用
listag()
函数

它将错误“value”作为无效标识符

SELECT
      LISTAGG ( TXT,
              ', ' )
      WITHIN GROUP (ORDER BY "value")
          "Result"
FROM
      (SELECT
            CASE
                WHEN MIN ( "value" ) = MAX ( "value" )
                THEN
                    CAST ( MIN ( "value" ) AS VARCHAR2 ( 400 ) )
                ELSE
                       MIN ( "value" )
                    || '-'
                    || MAX ( "value" )
            END
                AS TXT,
            MIN ( "value" ) AS SOURCE
       FROM
            (SELECT
                   ROW_NUMBER ( ) OVER (ORDER BY MIN ( "value" ))
                   - TO_NUMBER ( "value" )
                       AS GRP
             FROM
                   TABL2)
       GROUP BY
            GRP);
我猜是否存在类型不匹配。。??
你能帮我一下吗…

代码有很多问题。但是错误的原因是在子查询的SELECT中没有包含
value

我还注意到您缺少按id划分的
分区,这是进行所需分组所必需的。在外部查询中,您也没有按
id
进行分组

此查询:

SELECT id,
      LISTAGG ( TXT,', ' )
      WITHIN GROUP (ORDER BY source)"Result"
FROM
      (SELECT id,
            CASE
                WHEN MIN ( "value" ) = MAX ( "value" )
                THEN
                    CAST ( MIN ( "value" ) AS VARCHAR2 ( 400 ) )
                ELSE
                       MIN ( "value" )
                    || '-'
                    || MAX ( "value" )
            END
                AS TXT,
            MIN ( "value" ) AS SOURCE
       FROM (
            SELECT id,"value",
                   ROW_NUMBER ( )  OVER (partition by id ORDER BY MIN ( "value" ))
                   - TO_NUMBER ( "value" )
                       AS GRP
             FROM
                   TABL2
             GROUP BY id,"value"
       )
       GROUP BY
            id,GRP)
GROUP BY id
产生:

a   1-2, 5-8
b   4-6, 9

您有两个帐户吗@马丁:我没有两个账户……:)它只是相同,但我得到的错误是“value invalid identifier”,我的两个列都是varchars。你能帮我找出
value
列的名称是否真的小写吗?如果你对wm_concat没意见,那么它真的很简单。但不幸的是,它不受支持。@Joe。。。OP希望两个列都是varchar2。你拥有的是一个数字和varchar2。你能查一下吗???@realspirituals对不起,我不明白你的意思。由于LISTAGG的concat,输出固有地为varchar2。我最初在SQLFiddle中将“value”创建为一个数字,但将其更改为varchar2并不需要对SELECT进行任何更改,这两种方式都会产生相同的结果。