【问题标题】:How to create a result set of n*n in SQL (Oracle)?如何在 SQL (Oracle) 中创建 n*n 的结果集?
【发布时间】:2015-11-16 12:36:46
【问题描述】:

我需要创建一个包含 n 个数字的矩阵的报告 (BIRT),如下所示:

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3 
5 1 2 3 4

因此,我需要从我的数据库返回笛卡尔积 n*n 的有序结果集,其中行号和值从行号开始。

ROW  VALUE
 1     1
 1     2
 1     3
 1     4
 1     5     
 2     2
 2     3
 2     4
 2     5
 2     1
 3     3
 ...

我尝试了两次在同一个数字表之间创建交叉连接,

select * from (
  (select level as nr from dual connect by level <= 5)
cross join 
  (select level as nr from dual connect by level <= 5)
);

但这只会产生一个带有

的结果集
ROW   VALUE
 1      1
 1      2
 ...
 2      1
 2      2
 ...

感谢任何帮助,并对我的问题的奇怪描述感到抱歉。

【问题讨论】:

    标签: sql oracle birt


    【解决方案1】:

    您可以使用 connect by 生成数字,并使用除法和模数来生成行和值。计算本身很简单,但是你需要几个+1-1,因为level 开始于1 而不是0

    select
      trunc((level - 1) / N) + 1 as ROWNR,
      mod(level - 1 + trunc((level - 1) / N), N) + 1 as VALUE
    from
      (select 5 /* Here goes your number N */ as N from dual) d
    connect by
      level <= N*N
    

    【讨论】:

    • 我改变了几次公式,因为我没有注意到以行开头的值部分。也许它可以简化一点,但无论如何它似乎工作得很好。
    • 像魅力一样工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多