查询时候发现没有数据,或者报错,请检查原因,最简单的方法是一个一个表的找原因,
看下是那个表出现问题,例如:
select distinct a.*, b.status_int as paystatus /*a.sampleback*/
from v_lis_app_report_sample_info a, t_opr_attachrelation b
where a.application_id_chr = b.attachid_vchr(+)
and a.patient_type_id_chr = 2
and a.pstatus_int = 2
and a.form_int = 1
and b.status_int = 1
and sample_status_int > 0
and sample_status_int < 3
and sampleback = '0'
and application_dat >= timestamp
'2010-8-11 0:00:00'
and application_dat <= timestamp '2010-8-11 23:59:59'
order by a.application_dat desc;
----------------执行上面的语句时候发现报字段错误,此时不要急,应该看下表结构-----------------
CREATE OR REPLACE VIEW V_LIS_APP_REPORT_SAMPLE_INFO AS
(
SELECT DISTINCT t1.application_id_chr, t1.patientid_chr, t1.application_dat,
t1.sex_chr, t1.patient_name_vchr, t1.patient_subno_chr,
t1.age_chr, t1.patient_type_id_chr, t1.diagnose_vchr,
t1.bedno_chr, t1.icdcode_chr, t1.patientcardid_chr,
t1.application_form_no_chr, t1.modify_dat, t1.operator_id_chr,
t1.appl_empid_chr, t1.appl_deptid_chr, t1.summary_vchr,
t1.pstatus_int, t1.emergency_int, t1.special_int, t1.form_int,
t1.patient_inhospitalno_chr, t1.sample_type_id_chr,
t1.check_content_vchr, t1.sample_type_vchr, t1.oringin_dat,
t1.charge_info_vchr, t2.report_group_id_chr,
t2.status_int AS report_status_int, t2.reportor_id_chr,
t2.report_dat, t2.confirmer_id_chr, t2.confirm_dat,
t2.summary_vchr AS report_summary_vchr,
t2.xml_summary_vchr AS report_xml_sumary_vchr,
t3.sample_id_chr, t3.barcode_vchr,
DECODE -----------------------------------------------重点学习该函数
(t3.status_int,
NULL, 1,
t3.status_int
) AS sample_status_int,
t3.issampleback as sampleback,-------------------发现就是少了这个字段
t3.collector_id_chr, t3.samplestate_vchr,
t3.sampling_date_dat, t3.check_date_dat, t3.acceptor_id_chr,
t3.accept_dat, t3.checker_id_chr
FROM t_opr_lis_application t1, 表一
t_opr_lis_app_report t2, ----表二
(SELECT *
FROM t_opr_lis_sample
WHERE status_int > 0) t3 ------表三
WHERE t1.application_id_chr = t2.application_id_chr
AND t1.application_id_chr = t3.application_id_chr(+)
AND t1.pstatus_int >= 0
AND t2.status_int >= 0
)
------------------------------------------------------------------------------
分析一下函数的结构:
DECODE -----------------------------------------------重点学习该函数
(t3.status_int,
NULL, 1,
t3.status_int
) AS sample_status_int,
decode的用法- -
含义解释:
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
· 使用方法:
1、比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2、表、视图结构转化
现有一个商品销售表sale,表结构为:
month char(6) --月份
sell number(10,2) --月销售金额
现有数据为:
200001 1000
200002 1100
200003 1200
200004 1300
200005 1400
200006 1500
200007 1600
200101 1100
200202 1200
200301 1300
想要转化为以下结构的数据:
year char(4) --年份
month1 number(10,2) --1月销售金额
month2 number(10,2) --2月销售金额
month3 number(10,2) --3月销售金额
month4 number(10,2) --4月销售金额
month5 number(10,2) --5月销售金额
month6 number(10,2) --6月销售金额
month7 number(10,2) --7月销售金额
month8 number(10,2) --8月销售金额
month9 number(10,2) --9月销售金额
month10 number(10,2) --10月销售金额
month11 number(10,2) --11月销售金额
month12 number(10,2) --12月销售金额
结构转化的SQL语句为:
create or replace view
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
as
select
substrb(month,1,4),
sum(decode(substrb(month,5,2),'01',sell,0)),
sum(decode(substrb(month,5,2),'02',sell,0)),
sum(decode(substrb(month,5,2),'03',sell,0)),
sum(decode(substrb(month,5,2),'04',sell,0)),
sum(decode(substrb(month,5,2),'05',sell,0)),
sum(decode(substrb(month,5,2),'06',sell,0)),
sum(decode(substrb(month,5,2),'07',sell,0)),
sum(decode(substrb(month,5,2),'08',sell,0)),
sum(decode(substrb(month,5,2),'09',sell,0)),
sum(decode(substrb(month,5,2),'10',sell,0)),
sum(decode(substrb(month,5,2),'11',sell,0)),
sum(decode(substrb(month,5,2),'12',sell,0))
from sale
group by substrb(month,1,4);