1

我有以下表格和数据,

declare @tApplyProgram table (myID varchar(50), programID varchar(10), stTR char(1) null)
insert into @tApplyProgram(myID,programID) values('1925','184');
insert into @tApplyProgram(myID,programID) values('4474','172');
insert into @tApplyProgram(myID,programID) values('8890','172');
insert into @tApplyProgram(myID,programID) values('5578','172');
insert into @tApplyProgram(myID,programID) values('2980','172');
insert into @tApplyProgram(myID,programID) values('2500','172');
insert into @tApplyProgram(myID,programID) values('1925','180');
insert into @tApplyProgram(myID,programID) values('5578','180');
/*
@tApplyProgram keep applicant and their programID
myID and programID is unique
*/

declare @tResult table (myID varchar(50), subjectCd varchar(50))
insert into @tResult values('1925','01')
insert into @tResult values('1925','02')
insert into @tResult values('1925','03')
insert into @tResult values('4474','03')
insert into @tResult values('4474','04')
insert into @tResult values('4474','05')
insert into @tResult values('5578','01')
insert into @tResult values('5578','02')
insert into @tResult values('5578','03')
insert into @tResult values('2980','01')
insert into @tResult values('2980','02')
/*
@tResult keep their applicant's result
myID and subjectCd is unique
*/


declare @tRulesD table (programID varchar(50), subjectCd varchar(50))
insert into @tRulesD values('172','05')
insert into @tRulesD values('172','02')
insert into @tRulesD values('172','15')
insert into @tRulesD values('184','01')
insert into @tRulesD values('184','02')
insert into @tRulesD values('184','03')
/*
@tRulesD keep programID rules and regulation
programID and subjectCd is unique
*/

如果应用程序 ID (@tApplyProgram) 以满足要求 (@tRulesD),则设置 stTR=1。如果不满足要求,设置stTR=0。否则将其保留为 NULL

预期结果如下所示,

myID  | programID  | stTR
------------------------------------
1925    184          1           /*1925 have rows in @tResult, and 184 have rows in @tRulesD. And, it's meet the requirements */
4474    172          0           /*4474 have rows in @tResult, and 172 have rows in @tRulesD. But, it's not meet the requirements */
8890    172          NULL        /*8890 don't have rows in @tResult*/
5578    172          0           /*5578 have rows in @tResult, and 172 have rows in @tRulesD. But, it's not meet the requirement*/
2980    184          0           /*2980 have rows in @tResult, and 184 have rows in @tRulesD. But. it's not meet the requirement*/
2500    172          NULL        /*2500 don't have rows in @tResult*/
1925    180          NULL        /*180 don't have rows in @tRulesD*/
5578    180          NULL        /*180 don't have rows in @tRulesD*/

确实需要帮助来构建 T-SQL。我被困住了

4

2 回答 2

0

此查询可能对您有所帮助,我只是不明白“不符合要求”是什么意思:

select  myID, programID, 
        case 
            when (
                  (select case WHEN COUNT(*)>1 then 1 else null end from @tResult where myid=p.myid) +
                  (select case WHEN COUNT(*)>1 then 1 else null end from @tRulesD where programid=p.programid)
                 )>1 then 1 else null end 
from @tApplyProgram P
于 2012-04-13T09:49:36.820 回答
0

这是更新的子查询版本。它通过将来自结果的子查询和分别给定 myid 和 programid 的规则与按 subjectid 列的完全外部连接连接起来。然后对该结果集进行空值(未命中)测试。如果有未命中 max 将返回 1;如果所有值都匹配,则返回值为 0。这对双方都有效。如果没有未命中,总和将给出 0,我们返回 1。如果我们发现未命中,我们仍然需要确定每列的所有值是否为空。我们通过使用 count 测试非空值来做到这一点;如果找到,count 将给出 1,否则将给出零。如果双方至少有一个非空值,我们知道规则和结果都有匹配的行,所以我们返回 0。如果没有,则返回值为空。

update @tApplyProgram
set stTR = 
(
  select
    case when max (case when u.subjectcd is null then 1 else 0 end) 
            + max (case when r.subjectcd is null then 1 else 0 end)
            = 0
         then 1
         else case when count (u.subjectcd) > 0
                    and count (r.subjectcd) > 0
                   then 0 
                   else null 
               end

     end
    from (select * from @tResult r where r.myid = [@tApplyProgram].myid) r
    full outer join
         (select * from @tRulesD u where u.ProgramID = [@tApplyProgram].programid) u
     on r.subjectCd = u.subjectCd
)
于 2012-04-13T14:31:04.247 回答