请SQL高手帮忙,写个存储过程
表一:CZ_CPLYL
客户名称 型号 批号 刻号 供应商提供数 实际到位数 投料数 次品数 供应商材料利用率 实际利用率 良品率
1 AA M1493E 67999013 EF844802.23 4692 128 124 4 2.64 2.73 96.88
2 AA TP3003 4K24937 4K24937-01-G7 3092 3092 3063 29 99.06 100 99.06
3 AA TP3003 4K24937 4K24937-08-B3 3061 3061 3058 3 99.9 100 99.9
4 AB TP3003 090820-1 090820-1 25 25 23 2 92 100 92
5 AB TP3003 090820-2 090820-2 30 29 26 3 86.67 96.67 89.66
6 BB ADMTV804 Q64561.1 Q64561.1 239 244 238 6 99.58 102.09 97.54
7 BB ADMTV804 Q64566.1 Q64566.1 99 78 56 22 56.57 78.79 71.79
8 AC 21F384HW0 FR912997A G912997-22D1 7708 154 146 8 1.89 2 94.81
9 AC AP-96AA FA97-5324 FA975324-07-A0 3338 3336 3322 14 99.52 99.94 99.58
10 BC AP-96AA FA97-5324 FA975324-08-C3 3425 3425 3409 16 99.53 100 99.53
视图二:CZ_BLPMX
刻号 不良代码 不良明细 不良数量
1 67999013 Z09 调机报废 3
2 67999013 Z05 晶粒来料不良 1
3 4K24937-01-G7 Z06 晶粒刮伤 20
4 4K24937-01-G7 Z02 晶粒裂痕 6
5 4K24937-01-G7 Z09 调机报废 5
6 4K24937-08-B3 Z06 晶粒刮伤 3
表三:CZ_BLPDM
不良代码 不良明细
Z01 芯片抛料
Z02 晶粒裂痕
Z03 芯片沾污
Z04 晶粒崩边
Z05 晶粒来料不良
Z06 晶粒刮伤
Z08 误装报废
Z09 调机报废
Z10 Mapping错误
生成表四:CZ_BLP_HZ_MX
客户名称 型号 批号 刻号 次品数 芯片抛料 晶粒裂痕 芯片沾污 晶粒崩边 晶粒来料不良 晶粒刮伤 误装报废 调机报废 Mapping错误
1 AA M1493E 67999013 EF844802.23 4 1 3
2 AA TP3003 4K24937 4K24937-01-G7 29 6 20 5
3 AA TP3003 4K24937 4K24937-08-B3 3 3
4 AB TP3003 090820-1 090820-1 2
5 AB TP3003 090820-2 090820-2 3
6 BB ADMTV804 Q64561.1 Q64561.1 6
7 BB ADMTV804 Q64566.1 Q64566.1 22
8 AC 21F384HW0 FR912997A G912997-22D1 8
9 AC AP-96AA FA97-5324 FA975324-07-A0 14
10 BC AP-96AA FA97-5324 FA975324-08-C3 16
我是初学者,前台用的是delphi,把不良品明细汇总到具体的不良品数量后面,CZ_BLPDM这张表式动态的,因为随时会增加不良品的类型。请问我该怎么写。
------解决方案--------------------
这种行列转换使用动态拼接吧,参照一下这个
SQL code
如果项数不固定,使用存储过程动态SQL拼接
表结构如下:
t_fl:
lb
----
a
b
c
d
e
t_sj
id lb sl
-------------
1 a 10
1 c 30
1 d 40
1 e 50
2 b 20
2 e 50
想弄出这样一个结果:
id sl_a sl_b sl_c sl_d sl_e
---------------------------------
1 10 30 40 50
2 20 50
--1、如果t_fl表行数据不定的话可以写一个存储过程
CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
sqlstr VARCHAR2(4000) := '';
BEGIN
FOR cc IN (SELECT lb FROM t_fl) LOOP
sqlstr := sqlstr || 'sum(decode(lb,''' || cc.lb ||''',sl)) as "sl_'
|| cc.lb || '",';
END LOOP;
sqlstr := 'select id,' || rtrim(sqlstr,',') || ' from t_sj group by id';
OPEN o FOR sqlstr;
END row2col;