0

我有一些看起来像这样的数据 -

ColA     ColB    ColC
ID1      1       '1-1'
ID2      1       '2-1'
ID2      0       '2-2'
ID3      1       '3-1'
ID3      1       '3-2

我需要一个查询(对于 Oracle 10g),它按 ColA 的值对行进行分组,然后仅当组中的所有行的 ColB=1 时才返回连接的 ColC 的值。所以我想要给定数据的输出将是 -

"1-1"
"3-1,3-2"

关于如何编写这样的查询有什么建议吗?

谢谢!

4

2 回答 2

1
  SELECT colA, wm_concat(ColC)
    FROM table_name
   WHERE colB = 1
GROUP BY colA;

编辑- 您也可以像这样使用 LISTAGG 聚合函数:

  SELECT colA, LISTAGG(colC, ',') WITHIN GROUP (ORDER BY ColC)
    FROM table_name
   WHERE colB = 1
GROUP BY colA;

我建议使用 LISTAGG,因为它由 Oracle 记录,而 wm_concat 没有。

编辑:如果您不想显示像 ID2 这样的行,因为它有一行 ColB = 0,或者 colB != 1,您可以:

  SELECT colA, wm_concat(ColC)
    FROM table_name t1
   WHERE NOT EXISTS (SELECT 1
                       FROM table_name t2
                      WHERE colB != 1 -- Or, you can give colB = 0
                        AND t2.ColA = t1.ColA)
GROUP BY colA
于 2013-03-21T04:50:47.723 回答
0

如果你正在使用Oracle10g那么

select o1 from (select wm_concat(c3) o1,wm_concat(c2) o2 from table group by c1)
where length(o2)-length(replace(o2,'0',''))=0

为了11g

select o1 from (select listagg(c2,',') within group (order by c1) o2,
listagg(c3,',') within group (order by c1) o1 from table group by c1)
where length(o2)-length(replace(o2,'0',''))=0
于 2013-03-21T05:27:28.553 回答