日期:2014-05-17  浏览次数:20810 次

请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;