2

잘 작동하고 필요한 출력을 제공하는보기에 다음 코드가 있습니다.상위 레벨의 부모를 포함하는 cte 열을 추가하십시오.

;WITH ctesample 
    AS (SELECT sjob, 
       mjob, 
       mjob AS DisplayMJob, 
       groupf, 
       0 AS LVL 
     FROM dbo.vw_jobcosting_wipmastersub 
     WHERE (groupf = 'True') 
     UNION ALL 
     SELECT vw_JobCosting_WIPMasterSub_1.sjob, 
       vw_JobCosting_WIPMasterSub_1.mjob, 
       CASE S.lvl 
        WHEN 0 THEN S.sjob 
        ELSE S.displaymjob 
       END  AS DisplayMJob, 
       vw_JobCosting_WIPMasterSub_1.groupf, 
       S.lvl + 1 AS Expr1 
     FROM ctesample AS S 
       INNER JOIN dbo.vw_jobcosting_wipmastersub AS 
          vw_JobCosting_WIPMasterSub_1 
         ON S.sjob = vw_JobCosting_WIPMasterSub_1.mjob 
     WHERE (vw_JobCosting_WIPMasterSub_1.groupf = 'False')) 
SELECT sjob, 
     CASE 
     WHEN displaymjob IS NULL THEN sjob 
     ELSE displaymjob 
     END AS MJob, 
     groupf 
FROM ctesample AS cteSample_1 

I는 각 레코드에 대한 출력 MJob (안 SORCE 데이터 MJob)의 부모를주는 하나 개 이상의 항목을 추가 할 필요가있다.

소스 데이터 형식은 다음과 같습니다

╔═════════════════════════╗ 
║ SJob,MJob,GroupF  ║ 
╠═════════════════════════╣ 
║ 10001000,NULL,True  ║ 
║ 10001001,NULL,True  ║ 
║ 10001002,NULL,True  ║ 
║ 20001000,10001000,True ║ 
║ 20001001,10001001,True ║ 
║ 20001002,10001001,True ║ 
║ 20001003,10001002,True ║ 
║ 30001000,20001000,False ║ 
║ 30001001,20001000,False ║ 
║ 30001002,20001001,False ║ 
║ 30001003,20001002,False ║ 
║ 30001004,20001002,False ║ 
║ 30001005,20001003,False ║ 
║ 30001006,20001003,False ║ 
║ 30001007,30001000,False ║ 
║ 30001008,30001000,False ║ 
║ 30001009,30001001,False ║ 
║ 30001010,30001002,False ║ 
║ 30001011,30001002,False ║ 
║ 30001012,30001003,False ║ 
║ 30001013,30001004,False ║ 
║ 30001014,30001005,False ║ 
║ 30001015,30001006,False ║ 
║ 30001016,30001006,False ║ 
╚═════════════════════════╝ 

나는 그것을 해결하는 방법을 모르겠어요.
제안 사항을 크게 높이세요.

Sjob,Mjob,OutputMJob,GroupF 
10001000,NULL,NULL,TRUE 
10001001,NULL,NULL,TRUE 
10001002,NULL,NULL,TRUE 
20001000,10001000,NULL,TRUE 
20001001,10001001,NULL,TRUE 
20001002,10001001,NULL,TRUE 
20001003,10001002,NULL,TRUE 
30001000,20001000,10001000,FALSE 
30001001,20001000,10001000,FALSE 
30001002,20001001,10001001,FALSE 
30001003,20001002,10001001,FALSE 
30001004,20001002,10001001,FALSE 
30001005,20001003,10001002,FALSE 
30001006,20001003,10001002,FALSE 
30001007,20001000,10001000,FALSE 
30001008,20001000,10001000,FALSE 
30001009,20001000,10001000,FALSE 
30001010,20001001,10001001,FALSE 
30001011,20001001,10001001,FALSE 
30001012,20001002,10001001,FALSE 
30001013,20001002,10001001,FALSE 
30001014,20001003,10001002,FALSE 
30001015,20001003,10001002,FALSE 
30001016,20001003,10001002,FALSE 
+0

DB 구조에서 "출력 MJob의 상위"란 무엇을 의미합니까? – Szymon

답변

0

이 문제는 나에게 완전히 명확하지 않았다,하지만 내가 이해에서 당신은 다음과 같이합니다 :

필요한 출력은 다음과 같습니다 동작하는 예제를 찾을 수

;WITH ctesample 
    AS (SELECT sjob, 
       mjob, 
       mjob AS DisplayMJob, 
       groupf, 
       0 AS LVL, 
       NULL outputMjob 
     FROM dbo.vw_jobcosting_wipmastersub 
     WHERE (groupf = 'True') 
     UNION ALL 
     SELECT vw_JobCosting_WIPMasterSub_1.sjob, 
       vw_JobCosting_WIPMasterSub_1.mjob, 
       CASE S.lvl 
        WHEN 0 THEN S.sjob 
        ELSE S.displaymjob 
       END  AS DisplayMJob, 
       vw_JobCosting_WIPMasterSub_1.groupf, 
       S.lvl + 1 AS Expr1, 
       S.mjob 
     FROM ctesample AS S 
       INNER JOIN dbo.vw_jobcosting_wipmastersub AS 
          vw_JobCosting_WIPMasterSub_1 
         ON S.sjob = vw_JobCosting_WIPMasterSub_1.mjob 
     WHERE (vw_JobCosting_WIPMasterSub_1.groupf = 'False')) 
SELECT sjob, 
     CASE 
     WHEN displaymjob IS NULL THEN sjob 
     ELSE displaymjob 
     END AS MJob, 
     groupf, 
     outputmjob 
FROM ctesample AS cteSample_1 

SQL Fiddle에 있습니다.
정확하게 물어 보지 않은 질문이 있으면 알려 주시면보다 나은 답변을 제공해 드리도록하겠습니다.

+0

죄송합니다. 정말 명확하지 않았습니다. 그게 내가 필요한 것에 가깝지만, 그다지 중요하지 않습니다. 예제를 사용하면 OutputMJob은 항상 MJob의 부모가되어야합니다. – user2849560

+0

그래서 제발 좀 더 자세히 설명해 주시겠습니까? – Gidil

+0

나는 내가 필요로하는 것을 표현하는 데 약간의 어려움을 겪고 있으며, 나는 내가 한 결과물을 조롱했다. 이게 조금 더 명확 해지기를 바랍니다. – user2849560

관련 문제