微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为同一组的第一个添加新行

如何解决为同一组的第一个添加新行

我是 Firebird 的新手,需要您的帮助。我知道 Firebird 的任务不是打印漂亮的照片。

我有一个输出减少的存储过程:

姓名
可乐 马库斯
可乐 齐格弗里德
芬达 乔臣
啤酒 安娜
啤酒 曼努埃尔

我想在每组 Drink 的第一个值之前添加一个新的行和列,其中包含 Drink 的名称

所以输出应该是:

印刷饮料 姓名
可乐 可乐
可乐 马库斯
可乐 齐格弗里德
芬达 芬达
芬达 乔臣
啤酒 啤酒
啤酒 安娜
啤酒 曼努埃尔

我使用的是 Firebird 2.5.8

解决方法

假设您不想修改现有的存储过程,而是想“修饰”存储过程的输出,您需要执行以下操作:

execute block
  returns (
    drink varchar(50),"Drink for print" varchar(50),name varchar(50))
as
  declare drink_intermediate varchar(50);
  declare name_intermediate varchar(50);
begin
  for select drink,name 
    from drinks 
    order by drink 
    into drink_intermediate,name_intermediate
  do
  begin
    if (drink is distinct from drink_intermediate) then
    begin
        drink = drink_intermediate;
        "Drink for print" = drink_intermediate;
        name = null;
        suspend;
        "Drink for print" = null;
    end
    name = name_intermediate;
    suspend;
  end
end

也就是每次饮料变了,就需要多加一行。

您也可以在 DSQL 中执行类似的操作,但由于 distinct,当您有很多行时,这可能会更昂贵:

select distinct 
  drink,case a.type when 1 then drink end as "Drink for print",case a.type when 2 then name end as name
from drinks
cross join (
  select 1 as type from RDB$DATABASE
  union all
  select 2 as type from RDB$DATABASE
) a
order by drink,type

也就是说,对于存储过程的每一行,我们添加一个额外的行,其中填充了 "Drinks for print" 列而未填充了 name,然后我们取一个不同的(删除重复的行),并排序以获得一致的输出。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。