2014-01-23 1 views
0

다음과 같은 테이블이 있고 각 CARE_ID에 대해 단일 PLAN_ID 값을 반환하는 스크립트를 실행하고 싶습니다. 조건입니다. 어떻게하면 좋을까요? 나는 SQL Server 2005에서 스크립트를 쓰고 있어요하지만 SQL 서버와 호환 될 필요가있는 CARE_ID이있는 경우 2000SQL Server 2000 - 다른 3 열의 값을 기반으로 4 열 테이블에서 단일 열 값

  • 는 하나의 PLAN_ID 후 반환하는 CARE_ID 여러에게 PLAN_ID들이 PLAN_ID
  • 경우와 CARE_ID 여러에게 PLAN_ID의를 가지고 FIRST_TREATMENT_DATE의 값이 다음 가장 최근의 D가있는 PLAN_ID을 반환 NULL없는 경우 FIRST_TREATMENT_DATE의 값이 NULL는 가장 높은 값을 PLAN_ID
  • 를 반환한다

내 계산 N5_2_MDT_DATE 먹은는

PLAN_ID CARE_ID N5_2_MDT_DATE  FIRST_TREATMENT_DATE 
    1833 1  20/08/2011 00:00 NULL 
    199  1  23/06/2010 00:00 NULL 
    65  4  27/11/2009 00:00 NULL 
    162  5  30/07/2010 00:00 NULL 
    54  5  15/11/2009 00:00 NULL 
    55  5  29/10/2009 00:00 NULL 
    63  5  03/09/2009 00:00 NULL 
    2929 9  29/01/2013 00:00 NULL 
    99  9  08/03/2010 00:00 NULL 
    95  9  04/02/2010 00:00 NULL 
    64  9  18/11/2009 00:00 NULL 
    67  106  14/01/2013 00:00 NULL 
    96  106  20/07/2009 00:00 NULL 
    93  107  23/02/2010 00:00 21/09/2012 00:00 
    44  108  25/12/2009 00:00 NULL 
    43  108  07/10/2009 00:00 NULL 
    1136 364  18/02/2011 00:00 19/02/2011 00:00 
    1122 364  26/01/2011 00:00 19/02/2011 00:00 
    1046 1661 25/01/2011 00:00 25/01/2011 00:00 
    1047 1662 25/01/2011 00:00 25/01/2011 00:00 
    1048 1663 25/01/2011 00:00 01/02/2011 00:00 
    1049 1665 25/01/2011 00:00 NULL 
    1050 1666 23/01/2011 00:00 01/02/2011 00:00 
    1052 1667 01/02/2011 00:00 01/02/2011 00:00 
    1870 1781 04/10/2010 00:00 10/02/2011 00:00 
    1869 1781 04/10/2010 00:00 10/02/2011 00:00 
    1868 1781 04/10/2010 00:00 10/02/2011 00:00 
    2426 2246 23/03/2012 00:00 01/07/2012 00:00 
    2275 2246 01/01/2012 00:00 01/07/2012 00:00 
    2170 2246 14/10/2011 00:00 01/07/2012 00:00 
    1784 2246 04/08/2011 00:00 01/07/2012 00:00 
    1940 2246 10/07/2011 00:00 01/07/2012 00:00 
    1637 2246 20/06/2011 00:00 01/07/2012 00:00 
    1539 2246 02/06/2011 00:00 01/07/2012 00:00 
    1538 2246 01/06/2011 00:00 01/07/2012 00:00 
    1536 2246 31/05/2011 00:00 01/07/2012 00:00 
+0

을 하나를 수 'CARE_ID'는'NULL'' FIRST_TREATMENT_DATE'가있는 행과 NULL이 아닌 다른 행을 가지고 있습니까? 그리고 (이 질문에 영향을주지 않습니다) 그들은 서로 다른'FIRST_TREATMENT_DATE' 값을 가질 수 있습니까? –

+0

@Damien_The_Unbeliever - FIRST_TREATMENT_DATE의 값은 CARE_ID를 기반으로하므로 값은 모든 NULL 또는 모든 날짜가되며 N5_2_MDT_DATE 값은 PLAN_ID를 기반으로합니다. 희망이 확인됩니다. 감사. –

답변

1

내가 편리한 2000 인스턴스가없는 감사 스크립트가

1833,65,162,2929,67,93,44,1136,1046,1047,1048,1049,1050,1052,1870,2426 

PLAN_ID 값을 반환 것이라고 말하지만, 나는 생각한다 나는 언어의 호환 비트로 유지했습니다. 제 3의 조건을 위해, 같은 N5_2_MDT_DATE와 함께 2 개의 계획이 없을 것이다라고 생각하고있다.

select t1.CARE_ID, 
    CASE 
     --Cases one and two are identical, effectively 
     WHEN COUNT(*) = 1 OR MAX(t1.FIRST_TREATMENT_DATE) IS NULL 
       THEN MAX(t1.PLAN_ID) 
     ELSE MAX(CASE WHEN t1.N5_2_MDT_DATE = t2.LastDate THEN t1.PLAN_ID END) 
    END 
from @t t1 
    inner join 
    (select CARE_ID,MAX(N5_2_MDT_DATE) as LastDate 
    from @t 
    group by CARE_ID 
    ) t2 
     on t1.CARE_ID = t2.CARE_ID 
group by t1.CARE_ID 

당신은 내가주의 것 : 실제 대답이 먼저 나타나도록

는 사실, 1 제 다음 쿼리 데이터 설정에 하나의 스크립트로 이것을 실행하지만, 일을 정리하고 고려할 계획이 하나 밖에없는 경우 최고 계획 번호 계산에 아무런 해가 없기 때문에 사례 1과 2가 무너졌습니다.

또한, 우리는 어떤 계획을 사례 106으로 반환할지에 대해서는 동의하지 않지만 목록에있는 규칙에 따라 96이 올바른 것이 아니라 67 일 것이라고 확신합니다.

로직은 select의 CASE 표현식에 (거의) 모두 올라갔습니다. 모든 행에서 그룹 또는 MAX(FIRST_TREATMENT_DATE)에서 단 하나의 행이 있다면 그룹의 모든 행이 우리 그냥 MAX(PLAN_ID).

더 복잡한 경우는 3 번째 반환 NULL이있는 경우에만 일어날 수있는 (NULL입니다. 지원하기 위해 여기에 하위 쿼리 (t2)가 있으며 각 CASE_ID에 대해 가장 높은 값인 N5_2_MDT_DATE이 있습니다. CASE 표현의 ELSE 절에서이 값을 사용합니다. 여기에는 다른 집계가 포함됩니다. 특히 PLAN_IDN5_2_MDT_DATE 열이 t2에 의해 발견되는 가장 높은 것과 일치하는 경우 - 각 그룹에서 한 번만 발생해야합니다. 첫 번째 단락의 위의 d가 유지됩니다.

SQL Server의 최신 버전의 경우 CTE 및 ROW_NUMBER() 함수를 사용하면이 기능을 훨씬 쉽게 작성할 수 있습니다.I가 사용되는 테이블 변수


1 데이터 설정.

declare @t table (PLAN_ID int not null, CARE_ID int not null, 
     N5_2_MDT_DATE datetime not null,FIRST_TREATMENT_DATE datetime null) 
insert into @t(PLAN_ID,CARE_ID,N5_2_MDT_DATE,FIRST_TREATMENT_DATE) 
SELECT 1833, 1 ,'20110820',NULL  union all 
SELECT 199 , 1 ,'20100623',NULL  union all 
SELECT 65 , 4 ,'20091127',NULL  union all 
SELECT 162 , 5 ,'20100730',NULL  union all 
SELECT 54 , 5 ,'20091115',NULL  union all 
SELECT 55 , 5 ,'20091029',NULL  union all 
SELECT 63 , 5 ,'20090903',NULL  union all 
SELECT 2929, 9 ,'20130129',NULL  union all 
SELECT 99 , 9 ,'20100308',NULL  union all 
SELECT 95 , 9 ,'20100204',NULL  union all 
SELECT 64 , 9 ,'20091118',NULL  union all 
SELECT 67 , 106 ,'20130114',NULL  union all 
SELECT 96 , 106 ,'20090720',NULL  union all 
SELECT 93 , 107 ,'20100223','20120921' union all 
SELECT 44 , 108 ,'20091225',NULL  union all 
SELECT 43 , 108 ,'20091007',NULL  union all 
SELECT 1136, 364 ,'20110218','20110219' union all 
SELECT 1122, 364 ,'20110126','20110219' union all 
SELECT 1046, 1661 ,'20110125','20110125' union all 
SELECT 1047, 1662 ,'20110125','20110125' union all 
SELECT 1048, 1663 ,'20110125','20110201' union all 
SELECT 1049, 1665 ,'20110125',NULL  union all 
SELECT 1050, 1666 ,'20110123','20110201' union all 
SELECT 1052, 1667 ,'20110201','20110201' union all 
SELECT 1870, 1781 ,'20101004','20110210' union all 
SELECT 1869, 1781 ,'20101004','20110210' union all 
SELECT 1868, 1781 ,'20101004','20110210' union all 
SELECT 2426, 2246 ,'20120323','20120701' union all 
SELECT 2275, 2246 ,'20120101','20120701' union all 
SELECT 2170, 2246 ,'20111014','20120701' union all 
SELECT 1784, 2246 ,'20110804','20120701' union all 
SELECT 1940, 2246 ,'20110710','20120701' union all 
SELECT 1637, 2246 ,'20110620','20120701' union all 
SELECT 1539, 2246 ,'20110602','20120701' union all 
SELECT 1538, 2246 ,'20110601','20120701' union all 
SELECT 1536, 2246 ,'20110531','20120701' 
+0

Damien_The_Unbeliever - 훌륭합니다. 시간과 노력을 가져 주셔서 감사합니다! –

0
내가 조금에게 늦었

하지만 ...

select Care_ID, 
case when d.b is null then MAx(Plan_ID) else (select Distinct data.Plan_ID 
               from 
               (select max(N5_2_MDT_DATE) as N5_2_MDT_DATE 
                from data 
                group by CARE_ID) a 
               inner join data on data.N5_2_MDT_DATE = a.N5_2_MDT_DATE 
               Where d.Care_ID = data.Care_ID 

) End as Plan_ID 
from 
(
    select PLAN_ID, CARE_ID, Max(N5_2_MDT_DATE) as a, Max(FIRST_TREATMENT_DATE) as b 
    from data 
    group by PLAN_ID, CARE_ID  
) d  
Group by CARE_ID, d.b 

데모 : 위의 쿼리를 실행하려는 경우 쿼리 창에서 먼저 나타납니다 http://sqlfiddle.com/#!3/834f6/53

관련 문제