在一组多行行之间添加空行 - Oracle

时间:2018-01-05 09:06:19

标签: oracle

是否有可能动态地在一组数据行中添加空行?我有以下查询,它获取多行数据。我想分开,比如在每5行后添加空行。

查询:

select php.ref_dcp_key, sum(php.group_booking), count(php.group_booking), 0 
from gx_pnr_history ph, gx_pnr_his_prof php
where ph.gmpnr_loc_key = php.gmpnr_loc_key
group by php.ref_dcp_key order by php.ref_dcp_key;

1 个答案:

答案 0 :(得分:0)

@SandeepGowada,你必须为行创建一个外部结构,并在每5个数据行之后放入第6个填充行。

我认为@juergend的观点应该真正在表示层中完成(尽管通常它可能需要的总代码不比SQL中那么多 - 但它确实阻碍了静态以外的任何工作报告,就像允许重新排序或过滤的数据网格一样)

我已经将一些未经测试的代码(使用Oracle语法)组合在一起,该代码显示了它是如何完成的示例 - 我们如何准备基础数据,然后构建一个表格所有必要行的占位符,然后将基础数据连接到适当位置的占位符。我已经做了一些更精细的计算,以显示5号常数的使用位置。

此外,我还没有包含任何代码来删除最后一组中的任何多余填充行(即,无论基础数据如何,返回的行数始终是6的倍数)。

我也没有包含任何有关所需number_table或序列生成器的代码。

WITH base_data AS
(
    SELECT 
        php.ref_dcp_key
        ,sum(php.group_booking)     AS group_booking_sum
        ,count(php.group_booking)   AS group_booking_count
        ,0                          AS zero_value_column

        ,MOD(ROW_NUMBER() OVER (ORDER BY php.ref_dcp_key) - 1, 5)           AS group_line_num
        ,(  (ROW_NUMBER() OVER (ORDER BY php.ref_dcp_key) + (5 - 1)) / 5  )     AS row_group_num

        --all appearances of the number 5 constants determine the number of lines per group

    FROM
        gx_pnr_history /*AS*/ ph

    INNER JOIN
        gx_pnr_his_prof /*AS*/ php
        ON (ph.gmpnr_loc_key = php.gmpnr_loc_key)

    GROUP BY 
        php.ref_dcp_key 
)

,row_structure AS
(
    SELECT
        MOD(number - 1, (5 + 1))            AS group_line_num
        ,number + ((5 + 1) - 1) / (5 + 1)   AS row_group_num

    FROM
        number_table /*this needs to be a reference either to a numbers table, or a number sequence generator*/

    WHERE
        number BETWEEN 1 AND ((SELECT MAX(row_group_num) * (5 + 1) FROM base_data))
)

SELECT
    ref_dcp_key
    ,group_booking_sum
    ,group_booking_count
    ,zero_value_column
    ,ROW_NUMBER() OVER (ORDER BY row_structure.row_group_num ASC, row_structure.group_line_num ASC) AS final_order

FROM 
    row_structure

LEFT JOIN
    base_data
    ON (base_data.row_group_nun = row_structure.row_group_num)
    AND (base_data.group_line_num = row_structure.group_line_num)

ORDER BY 
    final_order