使用一列显示多行

时间:2013-05-28 22:08:13

标签: sql oracle oracle-sqldeveloper

我有两张桌子。标题和订单。标题有title_num。订单有title_num和order_num。每个标题都有很多订单。

我想显示title_num及其所有订单。但我想显示它,以便为多个order_nums显示1个title_num:

title_num| order_num
1          a
1          b
1          c
2          x
2          y

我希望它看起来像:

title_num| order_num

1          a
           b
           c

2          x
           y   

我尝试过使用左连接按标题对其进行排序,但这就是我被困住的地方。是否可以像这样显示它?

select t.title_num, o.order_num
from title t
left join order o
on t.title_num=o.title_num

3 个答案:

答案 0 :(得分:3)

(没有足够的代表发表评论,所以我会在答案中给出选项)

如果结果与上一行相同,则无法隐藏结果。相反,您可以在代码或报告中处理它。

  • 如果要在报告中显示,则可以在报告管理器中对结果进行分组。

  • 如果您在代码中进行迭代,请使用一个跟踪该列变量的变量。

    使用空字符串初始化变量。然后在迭代查询的数据集时:

    1. 如果当前行值与变量值相同,则显示空白。否则,显示行值。
    2. 将变量设置为当前行的值。

答案 1 :(得分:2)

您可以使用LAG函数和CASE语句执行此操作。

SELECT CASE WHEN LAG(title_num,1) OVER (PARTITION BY title_num ORDER BY order_num) IS NULL THEN title_num
              ELSE ' '
         END
      ,order_num
FROM Order

SQL Fiddle Demo

答案 2 :(得分:1)

使用窗口函数(Oracle术语中的分析函数)row_number()

SELECT CASE WHEN row_number() OVER (PARTITION BY title_num
                                    ORDER BY order_num) = 1 THEN
       title_num ELSE NULL END AS title_num
      ,order_num
FROM   ord o
ORDER  BY  o.title_num, order_num;

->SQLfiddle

为什么你JOINtitle?有没有订单的标题?否则你可以从查询中省略它。

请勿使用order之类的保留字作为表名。我在我的解决方案中使用了ord

注意我如何在o.title_num中对ORDER BY进行表格限定以引用输入列,而不是输出列。