【问题标题】:Oracle SQL query to return row values if all rows have some value in column after grouping by another column如果所有行在按另一列分组后在列中具有某些值,则 Oracle SQL 查询返回行值
【发布时间】:2013-03-21 04:44:00
【问题描述】:

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

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"

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

谢谢!

【问题讨论】:

  • 在oracle中搜索group_concat函数
  • @Dhinakaran: group_concat 在 MySQL 中可用。在 Oracle 中有 wm_concatLISTAGG

标签: sql oracle10g group-by


【解决方案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

【讨论】:

  • 感谢您的快速回复 - 希望 LISTAGG 存在于 10g 中!但我认为这个查询将返回属于某个组的行,其中某些行包含除 1 以外的 ColB 值?在上面的示例中,我不希望返回任何 ID2 行,因为第 2-2 行的 ColB=0。
  • 您的意思是,如果 ID2 甚至包含一行 ColB = 0,您不希望它显示在结果中,对吗?请确认,以便我可以编辑我的答案。它需要重新措辞。
【解决方案2】:

如果您使用的是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多