首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL查询,用于在按另一列分组后,如果所有行的列中都有一些值,则返回行值

Oracle SQL查询,用于在按另一列分组后,如果所有行的列中都有一些值,则返回行值
EN

Stack Overflow用户
提问于 2013-03-21 12:44:01
回答 2查看 1.6K关注 0票数 0

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

代码语言:javascript
复制
ColA     ColB    ColC
ID1      1       '1-1'
ID2      1       '2-1'
ID2      0       '2-2'
ID3      1       '3-1'
ID3      1       '3-2

我需要一个查询(对于Oracle10g),该查询根据ColA的值对行进行分组,然后仅当组中的所有行都有ColC时才返回串联的ColB=1的值。

代码语言:javascript
复制
"1-1"
"3-1,3-2"

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-21 12:50:48

代码语言:javascript
复制
  SELECT colA, wm_concat(ColC)
    FROM table_name
   WHERE colB = 1
GROUP BY colA;

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

代码语言:javascript
复制
  SELECT colA, LISTAGG(colC, ',') WITHIN GROUP (ORDER BY ColC)
    FROM table_name
   WHERE colB = 1
GROUP BY colA;

我建议使用LISTAGG,因为它是由Oracle记录的,而wm_concat不是。

EDIT :如果您不希望像ID2这样的行显示,因为它有一个ColB = 0或colB != 1的行,您可以:

代码语言:javascript
复制
  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
票数 1
EN

Stack Overflow用户

发布于 2013-03-21 13:27:29

如果您使用的是Oracle10g,那么

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15539667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档