问题描述
我是 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
,然后我们取一个不同的(删除重复的行),并排序以获得一致的输出。