收集SQL语句使用技巧!!! (300分)

  • 主题发起人 daxia003
  • 开始时间
D

daxia003

Unregistered / Unconfirmed
GUEST, unregistred user!
收集SQL语句使用技巧!!!(只要不是太普通的就行了!带条例子语句!)

一条十分!!!

先到先得!!!
 
SQL没有技巧,只有经验和学习。
 
具体问题,具体分析
 
给你一条以前在csdn看到的!
SELECT DISTINCT SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ) AS BGT_TYPE,
( CASE SUBSTRING( KMM102.KMM102_BGT_TYPE,3,2 ) WHEN "09" THEN "1" WHEN "10" THEN "2"
WHEN "11" THEN "3" ELSE "9" END ) AS BGT_CLASS,
SUBSTRING( KMM102.KMM102_BGT_TYPE,1,2 ) AS BGT_TEAM,

( ISNULL( (SELECT SUBSTRING(KMC101.KMC101_NAME,CHARINDEX("-",KMC101.KMC101_NAME)+1,12) FROM KMC101
WHERE ( KMC101.KMC101_TYPE = "BUDGETCODE" )
AND ( KMC101.KMC101_CODE = SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ) + "00" ) ),"" ) ) AS BGT_NAME,

SUM( ISNULL( KMM101.KMM101_BGT_JAN,0 ) ) AS BGT_AMT01,
SUM( ISNULL( KMM101.KMM101_BGT_FEB,0 ) ) AS BGT_AMT02,
SUM( ISNULL( KMM101.KMM101_BGT_MAR,0 ) ) AS BGT_AMT03,
SUM( ISNULL( KMM101.KMM101_BGT_APR,0 ) ) AS BGT_AMT04,
SUM( ISNULL( KMM101.KMM101_BGT_MAY,0 ) ) AS BGT_AMT05,
SUM( ISNULL( KMM101.KMM101_BGT_JUN,0 ) ) AS BGT_AMT06,
SUM( ISNULL( KMM101.KMM101_BGT_JUL,0 ) ) AS BGT_AMT07,
SUM( ISNULL( KMM101.KMM101_BGT_AUG,0 ) ) AS BGT_AMT08,
SUM( ISNULL( KMM101.KMM101_BGT_SEP,0 ) ) AS BGT_AMT09,
SUM( ISNULL( KMM101.KMM101_BGT_OCT,0 ) ) AS BGT_AMT10,
SUM( ISNULL( KMM101.KMM101_BGT_NOV,0 ) ) AS BGT_AMT11,
SUM( ISNULL( KMM101.KMM101_BGT_DEC,0 ) ) AS BGT_AMT12,

( SUM( ISNULL( KMM101.KMM101_BGT_JAN,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_FEB,0 ) ) +
SUM( ISNULL( KMM101.KMM101_BGT_MAR,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_APR,0 ) ) +
SUM( ISNULL( KMM101.KMM101_BGT_MAY,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_JUN,0 ) ) +
SUM( ISNULL( KMM101.KMM101_BGT_JUL,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_AUG,0 ) ) +
SUM( ISNULL( KMM101.KMM101_BGT_SEP,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_OCT,0 ) ) +
SUM( ISNULL( KMM101.KMM101_BGT_NOV,0 ) ) + SUM( ISNULL( KMM101.KMM101_BGT_DEC,0 ) ) ) AS AMT01,
( "XXXXXXXX" ) AS AMT02,

SUM( ISNULL( ( CASE WHEN ( CONVERT(CHAR(8),KMM102.KMM102_CHK_DATE,112) < "YYYYMMDD" )
THEN KMM102.KMM102_CHK_AMT ELSE 0 END ),0 ) ) AS AMT09,
SUM( ISNULL( ( CASE WHEN ( ( CONVERT(CHAR(8),KMM102.KMM102_OVER_DATE,112) < "YYYYMMDD" )
AND KMM102.KMM102_OVER_STATUS <> "00" )
THEN KMM102.KMM102_OVER_AMT
WHEN ( ( CONVERT(CHAR(8),KMM102.KMM102_OVER_DATE,112) < "YYYYMMDD" )
AND KMM102.KMM102_OVER_STATUS = "00" )
THEN KMM102.KMM102_OVER_AMT ELSE 0 END ),0 ) ) AS AMT07,
SUM( ISNULL( ( SELECT CASE WHEN ( ( CONVERT(CHAR(8),KMM103.KMM103_PAY_DATE,112) < "YYYYMMDD" )
AND KMM103.KMM103_PAY_STATUS <> "2" )
THEN KMM103.KMM103_PAY_AMT ELSE 0 END
FROM KMM103
WHERE ( KMM103.KMM103_YY = KMM102.KMM102_YY )
AND ( KMM103.KMM103_BGT_KIND = KMM102.KMM102_BGT_KIND )
AND ( KMM103.KMM103_CASE_NO = KMM102.KMM102_CASE_NO ) ),0 ) ) AS AMT03,
SUM( ISNULL( ( SELECT CASE WHEN ( ( CONVERT(CHAR(8),KMM103.KMM103_PAY_DATE,112) < "YYYYMMDD" )
AND KMM103.KMM103_PAY_STATUS <> "1" )
THEN KMM103.KMM103_PAY_AMT ELSE 0 END
FROM KMM103
WHERE ( KMM103.KMM103_YY = KMM102.KMM102_YY )
AND ( KMM103.KMM103_BGT_KIND = KMM102.KMM102_BGT_KIND )
AND ( KMM103.KMM103_CASE_NO = KMM102.KMM102_CASE_NO ) ),0 ) ) AS AMT04
FROM KMM102,
KMM101
WHERE ( KMM102.KMM102_YY = "YYY" ) AND
( KMM102.KMM102_BGT_KIND = "1" ) AND
( KMM101.KMM101_YY =* KMM102.KMM102_YY ) AND
( KMM101.KMM101_BGT_KIND =* KMM102.KMM102_BGT_KIND ) AND
( KMM101.KMM101_BGT_TYPE =* KMM102.KMM102_BGT_TYPE )
GROUP BY SUBSTRING( KMM102.KMM102_BGT_TYPE,1,4 ),
SUBSTRING( KMM102.KMM102_BGT_TYPE,3,2 ),
SUBSTRING( KMM102.KMM102_BGT_TYPE,1,2 )
ORDER BY BGT_CLASS ASC,
BGT_TYPE DESC
;
我这条如果只给10分是不是太少了!
大多数用select可能遇到的都遇到了!
 
Advanced SQL Code Collection v1.2.0

Powerful editor that enables you to write your SQL scripts efficiently. It includes SQL
syntax highlighting, large base of SQL code templates, power search engine and convenient
bookmarks
 
agree zane
 
一条两百分还差不多
 
select * from *
 
select * into #tmp from *
drop #tmp
 
select * from * --》这是什么东东呀?乱讲.
看下我的存贮过程吧,里面还有很多技巧.
CREATE PROCEDURE PickDelta
@pick_num char(14),
@prepare_by varchar(20),
@lcInitShipMaxNo varchar(20),
@lcInitSalesMaxNo varchar(20),
@ship_date datetime,
@GenNewSales varchar(200)='' output,
@GenNewShips varchar(200)='' output,
@Have_ship boolean=0 output
AS
declare @affect_row integer,@temp_store_qty integer
declare @DtempSeq_no tinyint,@Dtempproduct_code char(10),@Dtempvdr_id char(4),@Dtempstore_id char(6),@Dtempship_qty int
declare @i tinyint,@err_msg varchar(200),@Err_salesTitle varchar(100),@Have_LessSale bit
declare @c_id char(8),@tran_ltd varchar(80),@rec_acc_status char(1)
declare @TempStr varchar(20)
select @affect_row=0
select @Have_ship=0
select @i=0
SET NOCOUNT ON
if exists (select * from tempdb.dbo.sysobjects where name ="##temp_store")
begin
drop table ##temp_store
end
--得到本张检货单用到的所有的配件的库存临时表##temp_store
select * into ##temp_store from info_part_store where product_code+vdr_id+store_id in (select product_code+vdr_id+store_id
from pick_detail where pick_num=@pick_num)
if @@rowcount<=0
begin
raiserror('在库存中没有找到任何配件,请确认这张捡货单是否有效',16,1)
return
end
begin transaction
--定义所有客户游标cursor_client
select cursor_status('local','cursor_client')
if cursor_status('local','cursor_client')>0
begin
CLOSE cursor_client
DEALLOCATE cursor_client
end
declare cursor_client Cursor local For
select distinct a.c_id,isnull(b.tran_ltd,'') as tran_ltd,isnull(b.rec_acc_status,'') as rec_acc_status
from pick_detail a left join sales_title b on b.sales_no=a.sales_no where a.pick_num=@pick_num
Open cursor_client
-- 取出一个客户
Fetch Next From cursor_client into @c_id,@tran_ltd,@rec_acc_status
While @@Fetch_Status=0
begin
--依据每个不同的客户生成新的出库单
if exists (select * from tempdb.dbo.sysobjects where name ="##temp_pick")
begin
drop table ##temp_pick
end
--生成临时表的序号无论库存够与否都要生成出库单,如果所有对应的库存都是0或者没有找到对应的库位则不生成
select a.pick_num,a.seq_no into ##temp_pick from pick_detail a
left join info_part_store b on b.product_code=a.product_code and b.store_id=a.store_id and b.vdr_id=a.vdr_id
where pick_num=@pick_num and a.c_id=@c_id and a.ship_qty>0 and b.store_qty>0
--如果有数据可以生成出库单的话
if @@rowcount>0
begin
select @Have_Ship=1 --有数据可以生成出库单
--定义当前客户的临时游标
if cursor_status('local','cursor_pick_detail')>0
begin
CLOSE cursor_pick_detail
DEALLOCATE cursor_pick_detail
end
Declare cursor_pick_detail Cursor local For
select seq_no,product_code,vdr_id,store_id,ship_qty from pick_detail where pick_num=@pick_num and c_id=@c_id
order by product_code,vdr_id,store_id
Open cursor_pick_detail
--取出每一行的检货值
Fetch Next From cursor_pick_detail into @DtempSeq_no,@Dtempproduct_code,@Dtempvdr_id,@Dtempstore_id,@Dtempship_qty
While @@Fetch_Status=0
begin
--得到对应的库存数量
select @temp_store_qty=(select top 1 store_qty from ##temp_store
where product_code=@DtempProduct_code and vdr_id=@Dtempvdr_id and store_id=@Dtempstore_id)
--库存数量不为空
if @temp_store_qty is not null and @temp_store_qty>0
begin
--生成出库单明细资料
select @i=@i+1
insert ship_detail select @lcInitShipMaxNo,@i,a.product_code,a.vdr_id,a.vdr_short,a.chinese_name,
a.meter_unit,a.model_no,
case
when a.ship_qty>@temp_store_qty then @temp_store_qty
else a.ship_qty
end,
b.ref_sale_price,a.store_id,0,
'检货单号:'+a.pick_num+'行号:'+convert(varchar(10),a.seq_no) from pick_detail a
left join info_moto_part b on b.product_code=a.product_code
where a.pick_num=@pick_num and a.seq_no=@DtempSeq_No
if @@error<>0
begin
select @Err_msg="生成的出库单"+@lcInitShipMaxNo+"明细时出错"
raiserror(@Err_msg,16,1)
rollback transaction
end

--修改对应订单的完成数量
update sales_detail set cmp_qty=
case
when b.ship_qty>@temp_store_qty then @temp_store_qty
else b.ship_qty
end
from sales_detail a,pick_detail b where b.sales_no=a.sales_no and b.sales_seq_no=a.seq_no
end--处理当前客户每一行的捡货数量
Fetch Next From cursor_pick_detail into @DtempSeq_no,@Dtempproduct_code,@Dtempvdr_id,@Dtempstore_id,@Dtempship_qty
end--得到当前客户下一行的捡货数据
--生成出库单标题资料
if @Have_Ship=1
begin
--定义所有订单号游标cursor_sales
declare @AllSalesNo varchar(300)
declare @DtempSalesNo varchar(20)
select @AllSalesNo=''
if cursor_status('local','cursor_sales')>0
begin
CLOSE cursor_sales
DEALLOCATE cursor_sales
end
declare cursor_sales Cursor local For
select distinct sales_no from pick_detail where pick_num=@pick_num
open cursor_sales
Fetch Next From cursor_sales into @DtempSalesNo
While @@Fetch_Status=0
begin
if @AllSalesNo=''
select @AllSalesNo= "'"+@DtempSalesNo+"'"
else
select @AllSalesNo= "'"+@AllSalesNo+"',"+@DtempSalesNo
Fetch Next From cursor_sales into @DtempSalesNo
end
CLOSE cursor_sales
DEALLOCATE cursor_sales
insert into ship_title(flow_num,ship_num,ship_date,c_id,tran_ltd,ship_type_id,rec_acc_status,ship_status,prepare_by,remark,sales_no)
values(@pick_num,@lcInitShipMaxNo,@ship_Date,@c_id,@tran_ltd,'00',@rec_acc_status,'未审',@prepare_by,'检货单号:'+@pick_num,@AllSalesNo)
if @@error<>0
begin
select @Err_msg="生成的出库单"+@lcInitShipMaxNo+"标题时出错"
raiserror(@Err_msg,16,1)
rollback transaction
end
select @GenNewShips=@GenNewShips+char(13)+@lcInitShipMaxNo
select @TempStr=substring(@lcInitShipMaxNo,1,8)
select @lcInitShipMaxNo=convert(int,substring(@lcInitShipMaxNo,9,4))+1
select @lcInitShipMaxNo=@TempStr+replicate("0",4-len(convert(varchar(10),@lcInitShipMaxNo)))+convert(char(4),@lcInitShipMaxNo)
end
end --处理当前客户的捡货出库情况
--依据每个不同的客户生成新的缺货订单
if exists (select * from tempdb.dbo.sysobjects where name ="##temp_sales")
begin
drop table ##temp_sales
end
select @lcInitSalesMaxNo as sales_no,IDENTITY(int,1,1) as seq_no,a.product_code,a.vdr_id,a.vdr_short,a.chinese_name,a.meter_unit,a.model_no,
abs(isnull(b.store_qty,0)-sum(ship_qty)) as sales_qty,0 as cmp_qty,'缺货检货单;'+a.pick_num as remark into ##temp_sales from pick_detail a
left join ##temp_store b on b.product_code=a.product_code and b.vdr_id=a.vdr_id and b.store_id=a.store_id
where a.pick_num=@pick_num and c_id=@c_id group by a.product_code,a.chinese_name,a.meter_unit,a.model_no,a.vdr_id,
a.vdr_short,b.store_qty,a.pick_num having isnull(b.store_qty,0)-sum(a.ship_qty)<0
if @@rowcount>0
begin
select @Have_LessSale=1
insert sales_detail select * from ##temp_sales
if @@error<>0
begin
select @Err_salesTitle ="生成缺货订单的标题"+@lcInitSalesMaxNo+"出错"
raiserror(@Err_salesTitle,16,1)
rollback transaction
end
insert into sales_title(sales_no,c_id,c_short,sales_date,ship_type_id,po_status,remark) select
@lcInitSalesMaxNo,@c_id,c_short,getdate(),'00','未完','由检货单'+@pick_num+'生成' from info_client where c_id=@c_id
if @@error<>0
begin
select @Err_salesTitle ="生成缺货订单的明细"+@lcInitSalesMaxNo+"出错"
raiserror(@Err_salesTitle,16,1)
rollback transaction
end

select @GenNewSales=@GenNewSales+char(13)+@lcInitSalesMaxNo

select @TempStr=substring(@lcInitSalesMaxNo,1,8)
select @lcInitSalesMaxNo=convert(int,substring(@lcInitSalesMaxNo,9,4))+1
select @lcInitSalesMaxNo=@TempStr+replicate("0",4-len(convert(varchar(10),@lcInitSalesMaxNo)))+convert(char(4),@lcInitSalesMaxNo)
select @lcInitSalesMaxNo
end
--依据每个不同的客户生成新的缺货订单

--修改临时表的对应的配件的库存数量
update ##temp_store set store_qty=
case
when isnull(b.ship_qty,0)>store_qty then 0
else store_qty-isnull(b.ship_qty,0)
end
from ##temp_store a
left join pick_detail b on b.product_code=a.product_code and b.vdr_id=a.vdr_id and b.store_id=a.store_id
and b.pick_num=@pick_num and b.c_id=@c_id
Fetch Next From cursor_client into @c_id,@tran_ltd,@rec_acc_status
end-- 处理下一个客户
--修改实际库存数量
update info_part_store set store_qty=isnull(b.store_qty,0)
from info_part_store a,##temp_store b
where b.product_code=a.product_code and b.vdr_id=a.vdr_id and b.store_id=a.store_id
--修改相应的订单状态
Update sales_title set po_status="出库" where sales_no in
(select distinct sales_no from pick_detail where pick_num=@pick_num)
--修改检货单状态
update pick_title set pick_status="审核" where pick_num=@pick_num
if cursor_status('local','cursor_client')>0
begin
CLOSE cursor_client
DEALLOCATE cursor_client
end
if cursor_status('local','cursor_pick_detail')>0
begin
CLOSE cursor_pick_detail
DEALLOCATE cursor_pick_detail
end
commit transaction

 
太多了
if exists (select * from dbo.sysobjects where id = object_id('jltmp_单位基本情况表'))
drop table dbo.jltmp_单位基本情况表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_单位基本情况表2'))
drop table dbo.jltmp_单位基本情况表2
if exists (select * from dbo.sysobjects where id = object_id('jltmp_系统单位类别字典表'))
drop table dbo.jltmp_系统单位类别字典表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_系统经济性质字典表'))
drop table dbo.jltmp_系统经济性质字典表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_系统片区字典表'))
drop table dbo.jltmp_系统片区字典表
if exists (select * from dbo.sysobjects where id = object_id('jltmp_IncreNumber'))
drop function dbo.jltmp_IncreNumber
if exists (select * from dbo.sysobjects where id = object_id('jltmp_整理数据'))
drop procedure dbo.jltmp_整理数据
if exists (select * from dbo.sysobjects where id = object_id('jltmp_整理数据2'))
drop procedure dbo.jltmp_整理数据2
if exists (select * from dbo.sysobjects where id = object_id('jltmp_添加数据'))
drop procedure dbo.jltmp_添加数据
if exists (select * from dbo.sysobjects where id = object_id('dbo.jltmp_许可证编号转换'))
drop function dbo.jltmp_许可证编号转换
GO

create function dbo.jltmp_许可证编号转换
(
@psNumber varchar(100),
@len int
)
RETURNS varchar(100) AS
BEGIN
declare @sNewNumber varchar(100),
@iPos int
if @psNumber is null select @sNewNumber=null --返回null
else
begin
select @psNumber=ltrim(rtrim(@psNumber))
select @iPos=len(@psNumber)
--小于等于10为的许可证编码不变
if @iPos=0 select @sNewNumber=null --空格返回null
else begin
if @iPos<=10 select @sNewNumber=@psNumber
else begin
select @sNewNumber=substring(@psNumber,(@len+1),(@iPos-@len))
if len(ltrim(rtrim(@sNewNumber)))<>@iPos-@len select @sNewNumber=null
end
end
end
return @sNewNumber
END
GO

create table dbo.jltmp_单位基本情况表
(
申请编号 varchar(40) null,
单位名称 varchar(100) null,
单位类别 varchar(60) null,
经济性质 varchar(60) null,
地址 varchar(100) null,
电话 varchar(60) null,
法人或法人代表 varchar(60) null,
-- 负责人 varchar(60) null,
经营范围 varchar(80) null,
主管部门 varchar(60) null,
职工人数 int null,
从业人员数 int null,
建档日期 datetime null,
卫生许可证号 varchar(60) null,
卫生卡号 varchar(60) null,
片区 varchar(60) null,
操作日期 datetime null,
状态 varchar(60) null,
年度评价 varchar(255) null,
应体检日期 datetime null,
下次定期监测日期 datetime null,
档案编号 varchar(60) null,
卫生种类 varchar(60) null,
助记符 varchar(60) null,
有效开始日期 datetime null,
有效截止日期 datetime null,
最后复验日期 datetime null
)

create table dbo.jltmp_单位基本情况表2
(
申请编号 UDT_申请编号 not null,
档案编号 UDT_档案编号 not null,
单位名称 varchar(80) null,
法人代表 varchar(20) null,
经济性质 varchar(20) null,
片区 varchar(20) null,
地址 varchar(80) null,
街道 varchar(20) null,
电话 varchar(20) null,
职工人数 int null,
从业人数 int null,
卫生种类 varchar(10) null,
行业类别 varchar(40) null,
经营内容 varchar(80) null,
主管单位 varchar(60) null,
应体检人数 int null,
已体检人数 int null,
卫生许可证号 char(10) null,
助记符 varchar(40) null,
建档日期 datetime not null,
有效开始日期 datetime null,
有效截止日期 datetime null,
最后复验日期 datetime null
)


create table dbo.jltmp_系统单位类别字典表
(
编号 varchar(20) null,
内容 varchar(60) null,
卫生种类 varchar(20) null
)
create table dbo.jltmp_系统经济性质字典表
(
编号 varchar(20) null,
内容 varchar(60) null
)
create table dbo.jltmp_系统片区字典表
(
编号 varchar(20) null,
内容 varchar(60) null
)
GO


create function dbo.jltmp_IncreNumber
(
@psNumber varchar(100)
)
RETURNS varchar(100) AS
BEGIN

declare @sNewNumber varchar(100),@iPos int

if @psNumber is null select @sNewNumber='01'
else begin
select @iPos=len(@psNumber)
while @iPos>0 and substring(@psNumber,@iPos,1)>='0' and substring(@psNumber,@iPos,1)<='9'
select @iPos=@iPos - 1
if @iPos>0 begin
select @sNewNumber=substring(@psNumber,1,@iPos)
select @psNumber=substring(@psNumber,@iPos+1,len(@psNumber) - @iPos) end
else select @sNewNumber=''
select @iPos=len(@psNumber)
select @psNumber=rtrim(ltrim(str(convert(int, @psNumber)+1)))
-- @iPos may < len(@psNumber), for example, @psNumber = '9' + 1 -> '10'
--because replace(' ',space(<=0), '0')=' ', so
if @iPos<=len(@psNumber) select @sNewNumber=@sNewNumber+@psNumber
else select @sNewNumber=@sNewNumber+replace(space(@iPos -len(@psNumber)),' ', '0')+@psNumber
end
return @sNewNumber
END
GO









create procedure dbo.jltmp_整理数据2 as
BEGIN
set nocount on

--添加字典数据
delete jltmp_系统单位类别字典表
insert into jltmp_系统单位类别字典表 select distinct null,单位类别,卫生种类 from jltmp_单位基本情况表 where 单位类别 is not null
delete jltmp_系统片区字典表
insert into jltmp_系统片区字典表 select distinct null,片区 from jltmp_单位基本情况表 where 片区 is not null
delete jltmp_系统经济性质字典表
insert into jltmp_系统经济性质字典表 select distinct null,经济性质 from jltmp_单位基本情况表 where 经济性质 is not null

--经济性质升级与防疫26一致
update jltmp_单位基本情况表 set 经济性质 = case
when 经济性质 in ('国有','集体','私营') then 经济性质 + '企业'
when 经济性质 = '股份制' then '股份企业'
else 经济性质
end
update jltmp_系统经济性质字典表 set 内容 = case
when 内容 in ('国有','集体','私营') then 内容 + '企业'
when 内容 = '股份制' then '股份企业'
else 内容
end
--升级单位类别
update jltmp_单位基本情况表
set 单位类别 = case
when 单位类别 ='糕点 蜜饯' then '糕点,蜜饯'
else replace(单位类别,' ','')
end
update jltmp_系统单位类别字典表
set 内容 = case
when 内容 = '糕点 蜜饯' then '糕点,蜜饯'
else replace(内容,' ','')
end

--select distinct 单位类别 from jltmp_单位基本情况表
END
GO


create procedure dbo.jltmp_整理数据 as
BEGIN
set nocount on
--删除重复单位
delete jltmp_单位基本情况表 from jltmp_单位基本情况表 a,单位档案_单位基本信息表 b
where a.单位名称=b.单位名称 and a.片区=b.片区 and a.卫生种类=b.卫生种类 and a.经济性质=b.经济性质 and a.单位类别=b.行业类别

--删除已存在的单位类别
delete jltmp_系统单位类别字典表 from jltmp_系统单位类别字典表 a,系统管理_字典_字典内容表 b
where a.内容=b.名称 and b.ID=dbo.系统管理_获取字典类别ID('行业属性字典') and
b.Parent = (select InnerID from 系统管理_字典_字典内容表
where ID=dbo.系统管理_获取字典类别ID('行业属性字典') and
名称=a.卫生种类 and Parent=0)
--删除已存在的片区
delete jltmp_系统片区字典表 from jltmp_系统片区字典表 a,系统管理_字典_字典内容表 b
where a.内容=b.名称 and b.ID=dbo.系统管理_获取字典类别ID('片区街道字典') and Parent=0
--删除已存在的经济性质
delete jltmp_系统经济性质字典表 from jltmp_系统经济性质字典表 a,系统管理_字典_字典内容表 b
where a.内容=b.名称 and b.ID=dbo.系统管理_获取字典类别ID('经济性质字典') and Parent=0

--处理片区为null的单位
if exists (select * from jltmp_单位基本情况表 where 片区 is null)
begin
update jltmp_单位基本情况表
set 片区 ='<未定>'
where 片区 is null
insert into jltmp_系统片区字典表 values(null,'<未定>')
end
--处理经济性质为null的单位
if exists (select * from jltmp_单位基本情况表 where 经济性质 is null)
begin
update jltmp_单位基本情况表
set 经济性质 ='<未定>'
where 经济性质 is null
insert into jltmp_系统经济性质字典表 values(null,'<未定>')
end
--处理建档日期为null的单位,更改为当前日期
if exists (select * from jltmp_单位基本情况表 where 建档日期 is null)
begin
update jltmp_单位基本情况表
set 建档日期=getdate()
where 建档日期 is null
end

END
GO

create procedure dbo.jltmp_添加数据 as
BEGIN
set nocount on
declare
@申请编号 varchar(40),@单位名称 varchar(100),@单位类别 varchar(60),@经济性质 varchar(60),
@地址 varchar(100),@电话 varchar(60),@法人或法人代表 varchar(60),@负责人 varchar(60),
@经营范围 varchar(60),@主管部门 varchar(60),@职工人数 int,@从业人员数 int,
@建档日期 datetime,@卫生许可证号 varchar(60),@片区 varchar(60),@档案编号 varchar(60),
@卫生种类 varchar(60),@助记符 varchar(60),@编号 varchar(60),@内容 varchar(60),
@ID varchar(20),@InnerID int,
@有效开始日期 datetime,
@有效截止日期 datetime,
@最后复验日期 datetime

--逐个添加经济性质
declare cur经济性质 cursor for select distinct 内容 from jltmp_系统经济性质字典表
open cur经济性质
fetch cur经济性质 into @内容
select @ID=dbo.系统管理_获取字典类别ID('经济性质字典')
select @编号=isnull(max(编号),'00') from 系统管理_字典_字典内容表 where ID=@ID
while @@fetch_status=0 begin
select @编号=dbo.jltmp_IncreNumber(@编号)
insert into 系统管理_字典_字典内容表 values(@ID,@编号,@内容,'','<防疫25升级到26单位档案导入>',0)
fetch cur经济性质 into @内容
end
deallocate cur经济性质
--逐个添加片区
declare cur片区 cursor for select distinct 内容 from jltmp_系统片区字典表
open cur片区
fetch cur片区 into @内容
select @ID=dbo.系统管理_获取字典类别ID('片区街道字典')
select @编号=isnull(max(编号),'00') from 系统管理_字典_字典内容表 where ID=@ID
while @@fetch_status=0 begin
select @编号=dbo.jltmp_IncreNumber(@编号)
insert into 系统管理_字典_字典内容表 values(@ID,@编号,@内容,'','<防疫25升级到26单位档案导入>',0)
select @InnerID=max(InnerID) from 系统管理_字典_字典内容表
insert into 系统管理_字典_字典内容表 values(@ID,@编号+'01','<未定>','','<防疫25升级到26单位档案导入>',@InnerID)
fetch cur片区 into @内容
end
deallocate cur片区

--逐个添加单位类别
declare cur单位类别 cursor for select distinct 内容,卫生种类 from jltmp_系统单位类别字典表
open cur单位类别
fetch cur单位类别 into @内容,@卫生种类
select @ID=dbo.系统管理_获取字典类别ID('行业属性字典')
while @@fetch_status=0 begin
select @InnerID=InnerID from 系统管理_字典_字典内容表
where ID=@ID and 名称=@卫生种类 and Parent=0
select @编号=dbo.jltmp_IncreNumber(isnull(max(b.编号),max(a.编号)+'00'))
from 系统管理_字典_字典内容表 a left join 系统管理_字典_字典内容表 b on b.Parent = a.InnerID
where a.ID=@ID and a.名称=@卫生种类 and a.Parent=0
insert into 系统管理_字典_字典内容表 values(@ID,@编号,@内容,'','<防疫25升级到26单位档案导入>',@InnerID)
select @InnerID=max(InnerID) from 系统管理_字典_字典内容表
insert into 系统管理_字典_字典内容表 values(@ID,@编号+'0','单位类别','','<防疫25升级到26单位档案导入>',@InnerID)
insert into 系统管理_字典_字典内容表 values(@ID,@编号+'1','经营形式','','<防疫25升级到26单位档案导入>',@InnerID)
insert into 系统管理_字典_字典内容表 values(@ID,@编号+'2','许可项目','','<防疫25升级到26单位档案导入>',@InnerID)
fetch cur单位类别 into @内容,@卫生种类
end
deallocate cur单位类别

--逐个添加单位信息
declare cur单位基本情况表 cursor for
select distinct 单位名称,单位类别,经济性质,地址,电话,法人或法人代表,经营范围,主管部门,建档日期,
职工人数,从业人员数,卫生许可证号,片区,卫生种类,助记符,有效开始日期,有效截止日期,最后复验日期
from jltmp_单位基本情况表
open cur单位基本情况表
fetch cur单位基本情况表 into @单位名称,@单位类别,@经济性质,@地址,@电话,@法人或法人代表,@经营范围,@主管部门,
@建档日期,@职工人数,@从业人员数,@卫生许可证号,@片区,@卫生种类,@助记符,@有效开始日期,@有效截止日期,@最后复验日期
while @@fetch_status=0 begin

exec 系统管理_返回编号流水号 '单位档案管理','申请编号',@申请编号 output,Null

select @编号=编号 from 系统管理_字典_字典内容表 a,系统管理_字典_字典表列表 b
where a.ID=b.ID and b.名称='行业属性字典' and a.名称=@卫生种类

--以下暂时用 @编号 存储卫生种类的ID
--参考存储过程 单位档案_生成档案编号
declare @代号 char(5)
declare @编号类型 varchar(10)
if exists(select * from dbo.单位档案_档案编号使用情况表 where substring(档案编号,1,1) = @编号)
begin
select @档案编号 =min(CONVERT(int,档案编号)) from dbo.单位档案_档案编号使用情况表
with (holdlock)
where substring(档案编号,1,1) = @编号
delete from dbo.单位档案_档案编号使用情况表 where 档案编号 = @档案编号
end
else
begin
set @编号类型='档案编号' + @编号
exec 系统管理_返回编号流水号 '单位档案管理',@编号类型,@代号 output,null
set @档案编号 = @编号 + @代号
end

insert into jltmp_单位基本情况表2(单位名称,行业类别,经济性质,地址,电话,法人代表,经营内容,主管单位,
建档日期,职工人数,从业人数,卫生许可证号,片区,卫生种类,街道,申请编号,档案编号,助记符,应体检人数,已体检人数,有效开始日期,有效截止日期,最后复验日期)
values(@单位名称,@单位类别,@经济性质,@地址,@电话,@法人或法人代表,@经营范围,@主管部门,
@建档日期,@职工人数,@从业人员数,@卫生许可证号,@片区,@卫生种类,'<未定>',@申请编号,@档案编号,@助记符,0,0,@有效开始日期,@有效截止日期,@最后复验日期)

fetch cur单位基本情况表 into @单位名称,@单位类别,@经济性质,@地址,@电话,@法人或法人代表,@经营范围,@主管部门,
@建档日期,@职工人数,@从业人员数,@卫生许可证号,@片区,@卫生种类,@助记符,@有效开始日期,@有效截止日期,@最后复验日期
end
deallocate cur单位基本情况表

insert into 单位档案_单位基本信息表
(单位名称,行业类别,经济性质,地址,电话,法人代表,经营内容,主管单位,
建档日期,职工人数,从业人数,卫生许可证号,片区,卫生种类,街道,申请编号,档案编号,助记符,应体检人数,已体检人数)
select 单位名称,行业类别,经济性质,地址,电话,法人代表,经营内容,主管单位,
建档日期,职工人数,从业人数,卫生许可证号,片区,卫生种类,街道,申请编号,档案编号,助记符,应体检人数,已体检人数
from jltmp_单位基本情况表2


END

--delete dbo.单位档案_单位基本信息表
--delete dbo.许可证_使用信息表
--select a.申请编号,a.单位名称,a.卫生许可证号,a.卫生种类,a.建档日期,a.有效截止日期,a.有效开始日期,a.最后复验日期 from jltmp_单位基本情况表2 a where isnull(a.卫生许可证号,'')<>'' and a.申请编号 not in (select b.申请编号 from 许可证_使用信息表 b)
--select * from dbo.单位档案_单位基本信息表
--select * from dbo.jltmp_单位基本情况表2
 
还有,嘻嘻

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE 检验管理_自动评价
@p收检编号 VARCHAR ( 20 ) = '2001073101100003'
AS

set nocount on
declare @l返回值 varchar(2000),
@l单一样品评价 varchar(500),
@l样品数 int,
@l合格数 int, /*某一样品检验为合格的项目数*/
@l不合格数 int, /*某一样品检验为不合格的项目数*/
@l检验项目数 int, /*记录某单一样品的检验项目数*/
@li int, /*用于控制循环次数的变量*/
@lj int, /*用于控制循环次数的变量*/
@l检验结论 varchar(20)

/*建临时表并添入数据,用于记录本次收检的所有样品和每一样品的检验依据,检验结论。*/
select IDENTITY(int) as ID,a.样品名称,a.检验依据,a.检验结论,a.收检编号,a.样品系统编号
into #样品检验信息表
from 检验管理_收检样品信息表 a
where @p收检编号 = 收检编号

/*建临时表,用于记录样品的所有检验项目的检验结果信息.*/
create table #检验项目记录表(ID int IDENTITY,
收检编号 varchar(20),
样品系统编号 varchar(20),
项目名称 varchar(50),
单项结论 varchar(10))

select @li = 1, @l样品数 = max(ID),@l返回值 = '' from #样品检验信息表

while(@li <= @l样品数)
begin
truncate table #检验项目记录表

/*取出并记录下当前样品的检验项目及其结论*/
insert into #检验项目记录表(收检编号,样品系统编号,项目名称,单项结论)
select a.收检编号,a.样品系统编号,c.名称 as 项目名称,a.单项结论
from 检验管理_样品检验项目结果表 a,#样品检验信息表 b,系统管理_检验项目字典视图 c
where a.收检编号 = b.收检编号 and
a.样品系统编号 = b.样品系统编号 and
a.检验项目编号 = c.编号 and
b.ID = @li
order by a.单项结论

select @lj = 1,
@l检验项目数 = max(ID)
from #检验项目记录表

/*检查是否所有的项目都已检验完成(已下检验结论)*/
set @l合格数 = (select count(*) from #检验项目记录表 where 单项结论 = '合格')
set @l不合格数 = (select count(*) from #检验项目记录表 where 单项结论 = '不合格')
if (@l合格数 + @l不合格数 != @l检验项目数)
begin
-- RAISERROR('检验还没完成,不能自动评价',16,1)
-- return -1
set @l合格数 = @l检验项目数 - @l不合格数
end

/*拼自动评价字串*/
select @l单一样品评价 = '依据“' + 检验依据 + '”(标准、规范),' + 样品名称 + '经检测,其中所检 '
from #样品检验信息表 where ID = @li

while(@lj <= @l合格数) /*拼出合格的检验项目*/
begin
set @l单一样品评价 =ltrim(rtrim( @l单一样品评价)) + (select 项目名称 from #检验项目记录表 where @lj = ID)
+ ','

set @lj = @lj + 1
end

if(@l合格数 > 0)
set @l单一样品评价 = left(@l单一样品评价,len(@l单一样品评价) - 1) + '等项符合标准,'

while(@lj <= @l检验项目数) /*拼出不合格的检验项目*/
begin
set @l单一样品评价 = @l单一样品评价 + (select 项目名称 from #检验项目记录表 where @lj = ID)
+ convert(varchar(4),@lj) + ','

set @lj = @lj + 1
end

if(@l不合格数 > 0)
set @l单一样品评价 = left(@l单一样品评价,len(@l单一样品评价) - 1) + '等几项不符合标准,'

/*征对一个样品的所有检验项目下一个评价*/
set @l检验结论 = isnull((select 检验结论 from #样品检验信息表 where @li = ID),'合格')

if len(ltrim(@l检验结论)) = 0
set @l检验结论 = '合格'
set @l单一样品评价 = @l单一样品评价 + '判为' + @l检验结论
+ '。' + char(13) + char(10)

set @l返回值 = @l返回值 + @l单一样品评价

set @li = @li + 1
end

/*删除用过的监时表*/

select @l返回值 as 检验评价


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 
ASC,min,max,
sunstring ,getdate, 还有好多的东西,
最好去搞本SQL
书去看看里面一般都有的
 
谢谢各位回答
 
顶部