2017-11-20 11 views
0

안녕하세요 여러분, 내 이름은 Penelope이고 약 4 년의 SQL 경험이 있습니다. 우선이 글을 읽으면서 시간을내어 지시, 예, 도보 또는 안내를 제공 해준 것에 대해 감사 드리고 싶습니다. 저는 SQL 문제/퍼즐을 가지고 있습니다. 나는 여러 가지 레코드를 레코드에 연결하는 데 실패했습니다. 조인스에 대한 경험이 약간 있지만 내 머리가 조금 넘는 것 같아 약간의 도움이나 안내를 받기를 바랍니다. 나는 하나의 긴 학생 기록을 원하지만, 당신이 볼 수 있듯이 올바른 데이터를 얻고 있지만, 어떤 테이블은 하나 이상의 레코드를 가지고 있기 때문에 여러 레코드가 생성되고 있습니다. 아래에서 EntireStudentI라는 테이블에 하나의 레코드로 삽입해야하는 테이블과 컬럼의 이름을 볼 수 있습니다. 내 SQL, 내 현재의 결과는 나는 하나 개의 레코드 나에게 학생에 대한 기본 정보를 TP라는 테이블을 제공 한 어떤SQL의 새 테이블에서 4 개 테이블의 여러 행을 하나의 단일 행으로 결합하는 방법은 무엇입니까?

trans_type 
trk_link 
service_db  
scn 
given_nm 
surname_nm 
cc 
sex 
grade 
dob 
marital_st 
pob_city 
pob_cntry 
UScitizenship_CD 

나는 내게 여권 번호

를 원하는 하나 개의 레코드를 줄 것이다 P라는 테이블이 내 SQL에서 내가 설정 때문에 여권 그러나 비자 번호가이 경우에 같은 이름 -
pass_nbr 

나는 테이블은 학생이 복수 비자

pass_nbr을 가질 수로 나에게 여러 레코드를 줄 수있는 VI를 불렀다 VisaNo로 덜 혼란 스럽다. 이것은 레코드가 아닐 수 있습니다. 하나, 둘 ...

마지막으로 저는 학생의 부양 가족 구성원 인 PD라는 테이블을 가지고 있습니다. 이것은 하나, 둘 ...

given_nm 및 surname_nm

dep_rel 
birth-dt 

는 내가 뭘 원하는 TP에 대한 위에 나열된 열이있는 하나 개의 기록을 가지고있다 (이러한 DepName을 만들기 위해 연결된 것) 레코드 수 없다 .

그런 다음 pass_nbr을 P 테이블의 열로 추가하십시오.

그런 다음 VI 테이블의 VisaNo를 쉼표로 구분 된 열로 추가하십시오.  - VisaNo는 비어 있거나 비자 또는 다중 비자가 될 수 있습니다. 예는 빈 열 값, 즉 하나의 수입니다. 89888 또는 여러 값 89888,78908,78999.

마지막으로 PD 테이블에서 종속 정보 열을 추가하고 싶습니다. 학생은 부양 가족을 가질 필요가 없으며, 배우자와 자녀와 같이 여러 부양 가족이있을 수 있습니다. 배우자와 자녀는 두 개의 기록을 PD 테이블에 두 개의 개별 기록으로 만듭니다. 내 단일 레코드에서 나는 열이

이러한 모든 테이블이 내 SQL

인 키

하는 열라고 trk_link에 의해 서로 연결되어 Depname, 열 구분 dep_rel하고, 쉼표로 구분 birth_dt을 구분하도록 노력하겠습니다 것

SELECT t.trans_type 
     ,t.trk_link 
     ,t.service_db  
     ,t.scn 
     ,t.given_nm 
     ,t.surname_nm 
     ,t.cc 
     ,t.sex 
     ,t.grade 
     ,t.dob 
     ,t.marital_st 
     ,t.pob_city 
     ,t.pob_cntry 
     ,CASE t.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      WHEN 'DNH' THEN 'Does Not Hold' 
      else '' 
      End as Student_Citizenship_Status 

     --,t.UScitizenship_CD 
     ,t.trk_link20 
     ,p.pass_nbr 
     ,v.pass_nbr as VisaNo, 
     CONCAT(p2.given_nm, ' ', p2.surname_nm) As DepName 
     --,p2.given_nm 
     --,p2.surname_nm 
     ,p2.dep_rel 
     ,p2.birth_dt 
     ,CASE p2.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      else 'Does Not Hold' 
      End as Dependent_Citizenship_Status 

from TP t 
inner join P p 
on t.[trk_link] = p.[trk_link] 

inner Join VI v 

on p.[trk_link] = v.[trk_link] 

inner join PD p2 
on t.[trk_link] = p2.[trk_link] 

where t.trk_link = '22985200458053000003171117104111' 

그리고이 결과를

enter image description here

정말 고마워 얘들 아 0,123,516입니다Penelope!

답변

1

이렇게하는 방법은 많이 있습니다. STUFFXML PATH을 사용하거나 사용자 정의 함수를 사용할 수 있습니다.

가장 쉬운 방법은 사용자 정의 함수를 추가하고 원하는 곳 어디에서나 사용할 수 있습니다. 함수를 만들 필요조차 없습니다. 이미 GROUP_CONCAT string aggregate for SQL Server에서 사용할 수 있습니다. 다음과 같이

당신은 그것을 사용할 수 있습니다 당신은 내가 전에 말했듯이 STUFFXML PATH를 사용하여 시도 할 수 있습니다

some_id   delimited_list 
----------------- ----------------------------------- 
1     red,green,blue 
2     cyan,magenta,yellow,key 

또는

:

SELECT some_id, 
     dbo.GROUP_CONCAT(some_column) AS as delimited_list 
FROM dbo.some_table 
GROUP BY some_id; 

같은 출력을 제공합니다.

SELECT t.trans_type 
     ,t.trk_link 
     ,t.service_db  
     ,t.scn 
     ,t.given_nm 
     ,t.surname_nm 
     ,t.cc 
     ,t.sex 
     ,t.grade 
     ,t.dob 
     ,t.marital_st 
     ,t.pob_city 
     ,t.pob_cntry 
     ,CASE t.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      WHEN 'DNH' THEN 'Does Not Hold' 
      else '' 
      End as Student_Citizenship_Status 

     --,t.UScitizenship_CD 
     ,t.trk_link20 
     ,p.pass_nbr 
     --,v.pass_nbr as VisaNo, 
     ,STUFF((SELECT VisaNo 
       from VI as v 
       where v.[trk_link]=p.[trk_link] 
       FOR XML PATH('')),1,1,'') as VisaNumbers 
     ,CONCAT(p2.given_nm, ' ', p2.surname_nm) As DepName 
     --,p2.given_nm 
     --,p2.surname_nm 
     ,p2.dep_rel 
     ,p2.birth_dt 
     ,CASE p2.UScitizenship_CD 
      WHEN 'H' THEN 'Holds' 
      else 'Does Not Hold' 
      End as Dependent_Citizenship_Status 

from TP t 
inner join P p 
on t.[trk_link] = p.[trk_link] 
--inner Join VI v 
--on p.[trk_link] = v.[trk_link] 
inner join PD p2 on t.[trk_link] = p2.[trk_link] 
where t.trk_link = '22985200458053000003171117104111' 

참고 : 설명에은이 VisNumber 당신이 pass_nbr을 선택하려고하는 쿼리에 v table.But에 VisaNo로 저장되는 것을 주어졌다. 그래서, 어떻게 당신의 DB에 저장되었는지 모르겠습니다. 그에 따라 변경하십시오.

+0

감사합니다. 약간의 조정을 한 두 번째 예제는 내가 필요한 것을 정확히 제공해주었습니다. Penelope –

+0

@ PenelopeEstes 그게 다행이라고 생각합니다. 이 질문을 참조하는 다른 사람들에게 유용 할 수 있도록 정답으로 표시하는 것이 좋습니다. –