2011-04-25 4 views
0

두 행 사이를 검색하지만 두 행의 값만 일치하는 쿼리를 작성해야합니다. 내가 검색하는 데이터는 성을 보유하는 테이블이고 성은 별도의 행입니다. 내가 같은 줄에 보관해야한다고 말하지 마라. 나는 할 수 없다. 필자가해야 할 일은 레코드를 결합한 쿼리를 별도의 열에서 검색 할 수 있도록하는 것입니다. 다음쿼리에서 레코드 결합

데이터 형식은 다음

StudentValues 
    ID 
    StudentID 
    FieldID 
    Response 

1 fieldID가 응답 열에 내게 이름을 제공하고 (2)의 fieldID가 응답 열에 내게 성을 제공하고 StudentID 사용한 것 기록을 그룹화합니다.

지금

SELECT StudentId, MIN(CASE WHEN FieldId = 1 THEN Response ELSE NULL END) AS fname, MIN(CASE WHEN FieldId = 2 THEN Response ELSE NULL END) AS lname 
    FROM sms_studentvalues 
    WHERE fname = 'Some Value' 
     AND lname = 'Some Value' 
    GROUP BY studentid 

답변

2

업데이트] 다음과 같은 코멘트

SELECT * 
FROM (
    SELECT StudentId, 
      MIN(CASE WHEN FieldId = 1 THEN Response ELSE NULL END) AS Name, 
      MIN(CASE WHEN FieldId = 2 THEN Response ELSE NULL END) AS LastName 
    FROM YourTable 
    GROUP BY StudentId) AS StudentsNames 
WHERE Name = 'Some Value' AND LastName = 'Some Value' 
+0

나는 일을 복잡 이상까지했다. 나는 그룹핑과 케이스가 얼마나 유용 할 수 있는지 기억해야했다. –

+0

이것을 정답으로 표시하기 전에 쿼리에 where 절을 추가하는 방법은 무엇입니까? 위의 코드를 추가하십시오. –

+0

@Dave Long - 내 답변 업데이트 – Lamak

1

당신이 fieldID가에 PIVOT을 사용하는 방법에 대해 생각 해본 적이 실패 다음 SQL하지만 어디 절을 구축 할 수 있었다? 이렇게하면 동일한 쿼리에서 이름과 성 (FieldID = 1, FieldID = 2)을 모두 가져올 수 있습니다.

0
SELECT * 
FROM StudentValues s1 JOIN StudentValues s2 ON 
    s1.StudentID = s2.StudentID 
WHERE 
    s1.FieldID = 1 AND s1.Response = 'Larry' AND 
    s2.FieldID = 2 AND s2.Response = 'Ellison' 
0
SELECT a.ID, a.StudentID, a.Response, b.Response 
FROM StudentValues a 
INNER JOIN StudentValues B ON a.ID=b.ID and b.FieldID=2 
WHERE a.FieldID=1 
0

A는이 작업을 수행 할 수 있습니다 가입 :

SELECT 
    svf.Response AS FirstName, 
    svl.Response AS LastName 
FROM StudentValues svf 
    INNER JOIN StudentValues svl ON svf.StudentID = svl.StudentID 
     AND svl.FieldID = 2 
WHERE svf.FieldID = 1