如何使用存储过程连接2个表sql? [英] how to join 2 tables sql using stored procedure?

查看:75
本文介绍了如何使用存储过程连接2个表sql?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 更改 过程 Forms9( @ mdvn   int  @ mphc   varchar  4 ), @ mhsc   varchar  2 ), @ fdate   date  @ tdate   date 
as *
BEGIN
声明 @ fedddate date
声明 @ tedddate date
声明 @ v 1date date
声明 @ v2date date
声明 @ v3date date
set @ v1date = dateadd(dd,-190,< span class =code-sdkkeyword> @ fdate )
set @ v2date = dateadd(dd,-92, @ fdate
set @ v3date = dateadd(dd,-45, @fdate
set @ fedddate = dateadd(dd,-320, @ fdate
set @ tedddate = dateadd(dd, 30 @ tdate

SELECT DVN_CD,PHC_CD,HSC_CD,SUM(REGDT) AS REGDT,SUM(trims1) AS Trim1,sum(trims2) AS Trim2,
sum(ABORT) AS ABORT,sum(MTB) AS MTB,sum(LB) AS LB,sum(SB) AS SB,SUM(ANC1)< span class =code-keyword> as ANC1,SUM(ANC2) as ANC2,SUM(ANC3) as ANC3,
SUM(TT1) as TT1,sum(TTB2) as TT2,sum(IFA1) as IFA,sum(BP) as BP,sum(HB1) as HB FROM

SELECT a.DVN_CD,a.PHC_CD,a.HSC_CD,
CASE WHEN AN_Reg_Date BETWEEN @ fdate AND @tdate THEN 1 ELSE 0 END AS REGDT,
CASE WHEN DATEDIFF(DD,lmp,an_reg_date)< = 90 AND AN_Reg_Date BETWEEN @ fdate AND @ tdate 那么 1 ELSE 0 END AS trims1,
C ASE WHEN DATEDIFF(DD,lmp,an_reg_date)> 90 AND AN_Reg_Date BETWEEN @ fdate AND @ tdate 那么 1 ELSE 0 END AS trims2 ,
CASE WHEN Preg_outcome = 1 AND Deli_Date BETWEEN @ fdate AND @ tdate 那么 1 ELSE 0 END AS ABORT,
CASE WHEN Preg_outcome = 2 AND Deli_Date BETWEEN @ fdate AND @ tdate < span class =code-keyword> THEN
1 ELSE 0 END AS MTB,
CASE WHEN Preg_outcome = 3 AND Deli_Date BETWEEN @ fdate AND @tdate 那么 1 ELSE 0 END AS LB,
CASE WHEN Preg_outcome = 4 AND Deli_Date BETWEEN @ fdate AND @ tdate 那么 1 ELSE 0 END AS SB,
case visit_date @ v1date < span class =code-keyword>和 @ tdate 然后 1 else 0 end as ANC1,
case visit_date @ v2date @ tdate 然后 1 else 0 end as ANC2,
case visit_date @ v3date < span class =code-keyword>和 @ tdate 然后 1 else 0 end as ANC3,
case TTB = 1 TTDate 介于 @ fdate @ tdate 然后 1 其他 0 end as TT1,
case TTB> = 2 TTDate @ fdate @ tdate 然后 1 else 0 end as TTB2,
case 何时 IFA = 100 IFADate @ fdate @ tdate 然后 1 else 0 结束 as IFA1,
case when BP> = ' 140/90' ANEDD @ fdate @ tdate 然后 1 else 0 end as BP,
case HB< 11 ANEDD @时fdate @ tdate 然后 1 else 0 end as HB1

FROM Preg_cohort3 a join ANVisits3 b on a.DVN_CD = b.DVN_CD a.PHC_CD = b.PHC_CD a.HSC_CD = b.HSC_CD a.DVN_CD=@mdvn a.PHC_CD=@mphc a.HSC_CD=@mhsc
group by a.dvn_cd ,a.phc_cd,a.hsc_cd
返回
END



致电:

  exec  Forms9  42 '  8301''  01''  2012/01/01''  2012/01/31' 





我得到了输出结果......但结果不正确..我认为我在加入线上犯了一个错误..请任何人帮我...

我的原始输出是写的下面..但我得到了一些其他大值得到这个代码..

 dvn_cd phc_cd hsc_cd Regdt Trim1 Trim2 Abort MTB LB SB ANC1 ANC2 ANC3 TT1 TT2 IFA BP HB 
42 8301 01 0 0 0 0 0 2 0 119 16 0 0 0 0 0 1

解决方案

Iam不确定是什么输出你想要的。

看来你的SP非常复杂。如果你能给我更多的细节,我可以尝试解决更多问题。

但我觉得你需要改变你的查询是这样的。

chk希望这可以帮助您更好地查询您的查询。



 更改 过程 Forms9( @ mdvn   int  @ mphc   varchar  4 ), @ mhsc   varchar  2 ), @ fdate   date  @ tdate   date 
as *
BEGIN
声明 @fedddate date
声明 @tedddate date
声明 @ v1date 日期
声明 @ v2date date
声明 @ v3date date
set @ v1date = dateadd(dd,-190, @ fdate
set @ v2date = dateadd (dd,-92, @ fdate
set @ v3date = dateadd(dd, - 45, @ fdate
set @ fedddate = dateadd(dd,-320, @ fdate
set @ tedddate = dateadd(dd, 30 @ tdate

SELECT DVN_CD,PHC_CD ,HSC_CD,SUM(REGDT) AS REGDT,SUM(trims1) AS Trim1,sum(trims2) AS Trim2,
sum(ABORT) AS ABORT,sum(MTB) AS MTB,sum(LB) AS LB,sum(SB) AS SB,SUM(ANC1) ANC1,SUM(ANC2) ANC2,SUM(ANC3) ) as ANC3,
SUM(TT1) as TT1,sum(TTB2) as TT2,sum(IFA1) as IFA,sum(BP) as BP,sum(HB1) as HB FROM

SELECT a.DVN_CD,a.PHC_CD,a.HSC_CD,
CASE WHEN AN_Reg_Date THEN 1 ELSE 0 END AS REGDT,
CASE WHEN DATEDIFF(DD,lmp,an_reg_date)< = 90 AND AN_Reg_Date null < span class =code-keyword> THEN
1 ELSE 0 END AS trims1,
CASE WHEN DATEDIFF(DD,lmp,an_reg_date)> 90 AND AN_Reg_Date null 那么 1 ELSE 0 END AS trims2,
CASE WHEN Preg_outcome = 1 AND Deli_Date null 那么 1 ELSE 0 END AS ABORT,
CASE WHEN Preg_outcome = 2 AND Deli_Date null 那么 1 ELSE 0 END AS MTB,
CASE WHEN Preg_outcome = 3 AND Deli_Date null THEN 1 ELSE 0 END AS LB,
CASE WHEN Preg_outcome = 4 AND Deli_Date null 那么 1 ELSE 0 END AS SB,
案例 何时 visit_date null 然后 1 else 0 end as ANC1,
case visit_date nullthen 1 其他 0 end as ANC2,
case < span class =code-keyword>当
visit_date null 1 else 0 end as ANC3,
案例 TTB = 1 TTDate null 1 else 0 结束 TT1,
案例 TTB> = 2 TTDate null then 1 else 0 end as TTB2,
case IFA = 100 IFADate null 然后 1 else 0 end as IFA1,
case BP> = ' 140/90 ' ANEDDis null 然后 1 else 0 end as BP,
case 何时 HB< 11 ANEDD null 然后 1 else 0 end as HB1

FROM Preg_cohort3 a
内部 加入 ANVisits3 b
a.DVN_CD = b.DVN_CD a.PHC_CD = b.PHC_CD a.HSC_CD = b.HSC_CD
其中​​
a.DVN_CD=@mdvn a.PHC_CD=@mphc a.HSC_CD=@mhsc
AN_Reg_Date BETWEEN @ fdate AND @ tdate
group by a.dvn_cd,a.phc_cd,a.hsc_cd
RETURN
END


Alter Procedure Forms9(@mdvn int,@mphc varchar(4),@mhsc varchar(2), @fdate date, @tdate date)
as*
BEGIN 
declare @fedddate date
declare @tedddate date
declare @v1date date
declare @v2date date
declare @v3date date
set @v1date=dateadd(dd,-190,@fdate)
set @v2date=dateadd(dd,-92,@fdate)
set @v3date=dateadd(dd,-45,@fdate)
set @fedddate=dateadd(dd,-320,@fdate)
set @tedddate=dateadd(dd,30,@tdate)

SELECT DVN_CD,PHC_CD,HSC_CD,SUM(REGDT) AS REGDT,SUM(trims1)AS Trim1,sum(trims2) AS Trim2,
sum(ABORT) AS ABORT,sum(MTB) AS MTB,sum(LB)AS LB,sum(SB) AS SB,SUM(ANC1) as ANC1,SUM(ANC2) as ANC2,SUM(ANC3) as ANC3,
SUM(TT1) as TT1,sum(TTB2) as TT2,sum(IFA1) as IFA,sum(BP) as BP,sum(HB1) as HB FROM
(
  SELECT a.DVN_CD,a.PHC_CD,a.HSC_CD,
          CASE WHEN AN_Reg_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS REGDT,
          CASE WHEN DATEDIFF(DD,lmp,an_reg_date)<=90 AND AN_Reg_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS trims1,
          CASE WHEN DATEDIFF(DD,lmp,an_reg_date)>90  AND AN_Reg_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS trims2,
          CASE WHEN Preg_outcome=1 AND Deli_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS ABORT,
          CASE WHEN Preg_outcome=2 AND Deli_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS MTB,
          CASE WHEN Preg_outcome=3 AND Deli_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS LB,
          CASE WHEN Preg_outcome=4 AND Deli_Date BETWEEN @fdate AND @tdate THEN 1 ELSE 0 END AS SB,
          case when visit_date between @v1date and @tdate then 1 else 0 end as ANC1,
		  case when visit_date between @v2date and @tdate then 1 else 0 end as ANC2,
		  case when visit_date between @v3date and @tdate then 1 else 0 end as ANC3, 	 
		  case when TTB=1 and TTDate between @fdate and @tdate then 1 else 0 end as TT1,
		  case when TTB>=2 and TTDate between @fdate and @tdate then 1 else 0 end as TTB2,
		  case when IFA=100 and IFADate between @fdate and @tdate then 1 else 0  end as IFA1, 	 
		  case when BP>='140/90' and ANEDD between @fdate and @tdate then 1 else 0  end as BP,
		  case when HB<11 and ANEDD between @fdate and @tdate then 1 else 0 end as HB1
      
   FROM Preg_cohort3 a join ANVisits3 b on a.DVN_CD=b.DVN_CD and a.PHC_CD=b.PHC_CD and a.HSC_CD=b.HSC_CD and a.DVN_CD=@mdvn and a.PHC_CD=@mphc and a.HSC_CD=@mhsc 
)a group by a.dvn_cd,a.phc_cd,a.hsc_cd
RETURN 
END


Call:

exec Forms9 42,'8301','01','2012/01/01','2012/01/31'



I got the output result ... But that result is not correct.. I think i made a mistake on that joining line.. Pls any one help me...
My original output was written below.. but i got some other big values getting this code..

dvn_cd phc_cd hsc_cd Regdt Trim1 Trim2 Abort MTB LB SB ANC1 ANC2 ANC3 TT1 TT2 IFA BP HB
42     8301    01     0      0     0     0    0  2   0 119  16	  0   0    0   0  0   1

解决方案

Iam Not Sure what output you want.
it seems your SP is very complex .If you could give me more detail and i can try to solve more.
but i think you need to change your query like this.
chk with this hope this will be help you to work out more on your query.

Alter Procedure Forms9(@mdvn int,@mphc varchar(4),@mhsc varchar(2), @fdate date, @tdate date)
as*
BEGIN 
declare @fedddate date
declare @tedddate date
declare @v1date date
declare @v2date date
declare @v3date date
set @v1date=dateadd(dd,-190,@fdate)
set @v2date=dateadd(dd,-92,@fdate)
set @v3date=dateadd(dd,-45,@fdate)
set @fedddate=dateadd(dd,-320,@fdate)
set @tedddate=dateadd(dd,30,@tdate)

SELECT DVN_CD,PHC_CD,HSC_CD,SUM(REGDT) AS REGDT,SUM(trims1)AS Trim1,sum(trims2) AS Trim2,
sum(ABORT) AS ABORT,sum(MTB) AS MTB,sum(LB)AS LB,sum(SB) AS SB,SUM(ANC1) as ANC1,SUM(ANC2) as ANC2,SUM(ANC3) as ANC3,
SUM(TT1) as TT1,sum(TTB2) as TT2,sum(IFA1) as IFA,sum(BP) as BP,sum(HB1) as HB FROM
(
  SELECT a.DVN_CD,a.PHC_CD,a.HSC_CD,
          CASE WHEN AN_Reg_Date is not null THEN 1 ELSE 0 END AS REGDT,
          CASE WHEN DATEDIFF(DD,lmp,an_reg_date)<=90 AND AN_Reg_Date is not null THEN 1 ELSE 0 END AS trims1,
          CASE WHEN DATEDIFF(DD,lmp,an_reg_date)>90  AND AN_Reg_Date is not null THEN 1 ELSE 0 END AS trims2,
          CASE WHEN Preg_outcome=1 AND Deli_Date is not null THEN 1 ELSE 0 END AS ABORT,
          CASE WHEN Preg_outcome=2 AND Deli_Date is not null THEN 1 ELSE 0 END AS MTB,
          CASE WHEN Preg_outcome=3 AND Deli_Date is not null THEN 1 ELSE 0 END AS LB,
          CASE WHEN Preg_outcome=4 AND Deli_Date is not null THEN 1 ELSE 0 END AS SB,
          case when visit_date is not null then 1 else 0 end as ANC1,
		  case when visit_date is not nullthen 1 else 0 end as ANC2,
		  case when visit_date is not null then 1 else 0 end as ANC3, 	 
		  case when TTB=1 and TTDate is not null then 1 else 0 end as TT1,
		  case when TTB>=2 and TTDate is not null then 1 else 0 end as TTB2,
		  case when IFA=100 and IFADate is not null then 1 else 0  end as IFA1, 	 
		  case when BP>='140/90' and ANEDDis not null then 1 else 0  end as BP,
		  case when HB<11 and ANEDD is not null then 1 else 0 end as HB1
      
   FROM Preg_cohort3 a 
   Inner join ANVisits3 b 
   on a.DVN_CD=b.DVN_CD and a.PHC_CD=b.PHC_CD and a.HSC_CD=b.HSC_CD 
   Where
    a.DVN_CD=@mdvn and a.PHC_CD=@mphc and a.HSC_CD=@mhsc 
    and  AN_Reg_Date BETWEEN @fdate AND @tdate 
)a group by a.dvn_cd,a.phc_cd,a.hsc_cd
RETURN 
END


这篇关于如何使用存储过程连接2个表sql?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆