我有三张表:
学生(Tstudent):
stud_id stud_name
1 小张
..........
科目(Tcourse):
cour_id cour_name
1 语文
...
Tselecourse:
sele_stud_id sele_cour_id sele_score(分数)
1 1 80我的存储过程:
create procedure sp_executesql
as
declare variable SQLString varchar(4000);
declare variable temp_courid integer;
declare variable temp_courname char(40);
begin
declare cursor_xkb cursor for select distinct
sele_cour_id,cour_name from tselecourse ,tcourse where
tselecourse.sele_cour_id = tcourse.cour_id;
/* Procedure Text */
SQLString = N'select stud_name 学生姓名,';
open cursor_xkb;
fetch cursor_xkb into temp_courid, temp_courname;
while(!SQLCODE)
{
SQLString = SQLString + N'sum(case sele_cour_id when '
+ cast(temp_courid as varchar) + N'then sele_scor end) as "'
+ temp_courname +'",';
fetch cursor_xkb into temp_courid, temp_courname;
}
close cursor_xkb;
SQLString = left(SQLString,length(SQLString)-1);
SQLString = SQLString + N' from tselecourse,tstudent
where tselecourse.sele_cour_id = tstudent.stud_id group by tstudent.stud_name';
execute sp_executesql SQLString
suspend;
end我刚学interbase,有很多不懂,请大家帮我看一看
学生(Tstudent):
stud_id stud_name
1 小张
..........
科目(Tcourse):
cour_id cour_name
1 语文
...
Tselecourse:
sele_stud_id sele_cour_id sele_score(分数)
1 1 80我的存储过程:
create procedure sp_executesql
as
declare variable SQLString varchar(4000);
declare variable temp_courid integer;
declare variable temp_courname char(40);
begin
declare cursor_xkb cursor for select distinct
sele_cour_id,cour_name from tselecourse ,tcourse where
tselecourse.sele_cour_id = tcourse.cour_id;
/* Procedure Text */
SQLString = N'select stud_name 学生姓名,';
open cursor_xkb;
fetch cursor_xkb into temp_courid, temp_courname;
while(!SQLCODE)
{
SQLString = SQLString + N'sum(case sele_cour_id when '
+ cast(temp_courid as varchar) + N'then sele_scor end) as "'
+ temp_courname +'",';
fetch cursor_xkb into temp_courid, temp_courname;
}
close cursor_xkb;
SQLString = left(SQLString,length(SQLString)-1);
SQLString = SQLString + N' from tselecourse,tstudent
where tselecourse.sele_cour_id = tstudent.stud_id group by tstudent.stud_name';
execute sp_executesql SQLString
suspend;
end我刚学interbase,有很多不懂,请大家帮我看一看
跟这个问题http://expert.csdn.net/Expert/topic/2696/2696160.xml?temp=.7145044有点类似,在那个问题里面我是建表做过测试并且成功的。你这里只是又多了一个关联表而已,在下列语句中用left join来体现这个多出来的关联declare @sql varchar(8000)
set @sql = ''
select @sql = @sql + ' sum(case when sele_cour_id = ' + convert(varchar(20), cour_id) +
' then sele_score else null end) as ' + cour_name + ','
from TCourse --这里根据科目表取所有科目set @sql = 'select tmp.*, t1.stud_name
from (select ' + @sql + ' sele_stud_id
from table1
group by sele_stud_id) tmp
left join Tstudent t1
on t1.stud_id = tmp.sele_stud_id '
exec(@sql)
我就是不能把它转成interbase 的,那位高手能帮一下
我从网上查到interbase 不能直接做出动态交叉表,先得做
一个临时试图:>> > > 一客户销售表,输入数据后排列为:
>> > > STYLE COLOR CLIENT sale_quantity, sale_date
>> > > SW001 红色 001 100 2003-5-6
>> > > SW001 黑色 002 200 2003-5-6
>> > > SW002 白色 001 50 2003-5-6
>> > > SW002 黄色 002 50 2003-5-6
>> > > SW001 红色 001 25 2003-5-8
>> > > SW003 蓝色 002 15 2003-5-8
>> > > SW001 黑色 001 100 2003-5-6
>> > > SW003 白色 001 20 2003-5-10
>> > > .. .
>> > > . .
>> > > 客戶數量,颜色不確定,是動態的。
>> > >
>> > > 現在是要將每个客户销售数量,款式,颜色汇总后的顯示結果排為
>> > > STYLE color 001 002 。。
>> > > SW001 红色 125 0
>> > > SW001 黑色 100 200
>> > > SW002 白色 50 0
>> > > SW002 黄色 0 50
>> > > SW003 蓝色 0 15
>> > > SW003 白色 20 0
利用堂主的方法略修改后如下:
CREATE PROCEDURE PROC_20031224_DC_QUERY
AS
DECLARE VARIABLE H_C VARCHAR(12);(堂主的原是INTEGER)
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE HC_STR VARCHAR(2000);
DECLARE VARIABLE H_MOD VARCHAR(3);
DECLARE VARIABLE H_N VARCHAR(12);
BEGIN
/*
* 判断视图 VIEW_20031224_DC_QUERY 是否存在,
* 如果存在,将其删除
*/
IF (EXISTS (SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME='VIEW_200_DC_QUERY'))
THEN BEGIN
EXECUTE STATEMENT 'DROP VIEW "VIEW_200_DC_QUERY"';
END /*
* 确定客户数量
*/ HC_STR='CREATE VIEW "VIEW_200_DC_QUERY" (STYLE,COLOR';
H_MOD=';
for SELECT DISTINCT CLIENT FROM SALEDETAIL INTO :H_C do/*△△△△*/
begin
/*生成客户字段*/
HC_STR=HC_STR||','||:H_C;/*☆☆☆☆*/
END
HC_STR=HC_STR||') AS SELECT MAX(STYLE),MAX(COLOR)';
H_MOD=';
FOR SELECT DISTINCT CLIENT
FROM ORDERDETAIL
ORDER BY CLIENT
INTO :H_N
DO
BEGIN
/*
* 统计销售数量
*/
H_MOD=',';
HC_STR=HC_STR||H_MOD||'SUM(CASE CLIENT WHEN '' ||:H_N||'' THEN SAKE_QUANTITY ELSE 0 END) AS C_SALE'||CAST(I AS VARCHAR(2));
I=I+1;
END
HC_STR=HC_STR||' FROM SALEDETAIL GROUP BY STYLE,COLOR';
/*
* 生成新的动态视图
*/
EXECUTE STATEMENT HC_STR;
EXIT;
END
但我还是调试不通过.
请大家帮帮忙
先谢谢了
没办法`
用到了interbase临时学学