2013-02-08 3 views
3

나는 견적을 가지고 있으며 그 견적에 대한 마지막 3 메모를 단일 행에 가져 오려고합니다. 3 행을 한 행으로 축

QuoteNoteID  QuoteID  Note  NoteAreaID 
    1    1   Test   2 
    2    1   Test2   1 
    3    1   Test3   1 

은 내가이 나에게

QuoteNoteID  QuoteID  Note  NoteAreaID  NoteAreaDesc 
    1    1   Test   2    Internal 
    2    1   Test2   1    External 
    3    1   Test3   1    External 
을 제공

SELECT q.QuoteNoteID, q.QuoteID, q.Note, q.NoteAreaID, n.Description AS NoteAreaDesc 
FROM Quote q INNER JOIN QuoteNote n ON n.QuoteID = q.QuoteID 

를 필요로하는 정보를 날 다시 가져 오는이 테이블에 선택이 : 따옴표에서 상위 3 개를 선택하여 나는 QuoteNote 테이블이

이제 이걸 한 행에 넣는 것입니다.

QuoteID Note1 Note2 Note3 NoteAreaID1  NoteAreaID2 NoteAreaID3 NoteAreaDesc1 NoteAreaDesc2  NoteAreaDesc3 
    1   Test  Test2 Tes3   2    1    1   Internal   External  External   
어떤 도움을 주시면 감사하겠습니다

, 감사

+0

희망이 도움이 될 : 제안에 대한 http://stackoverflow.com/questions/9117955/making-row-values-into-column-values-sql-pivot – Kaf

+0

@Kaf 감사하지만 피벗은 단 하나의 열에 대해서만 작동합니다. 다중 열 솔루션이 필요합니다. – CR41G14

답변

2

이 당신을 위해 작동합니다 :

WITH QuoteNotes AS 
( SELECT QuoteNote.QuoteNoteID, 
      Quote.QuoteID, 
      QuoteNote.Note, 
      QuoteNote.NoteAreaID, 
      [NoteAreaDesc] = QuoteNote.Description, 
      [QuoteNoteNumber] = ROW_NUMBER() OVER(PARTITION BY Quote.QuoteID ORDER BY QuoteNote.QuoteNoteID) 
    FROM Quote 
      INNER JOIN QuoteNote 
       ON QuoteNote.QuoteID = Quote.QuoteID 
) 
SELECT QuoteID, 
     [Note1] = MAX(CASE WHEN QuoteNoteNumber = 1 THEN Note END), 
     [Note2] = MAX(CASE WHEN QuoteNoteNumber = 2 THEN Note END), 
     [Note3] = MAX(CASE WHEN QuoteNoteNumber = 3 THEN Note END), 
     [NoteAreaID1] = MAX(CASE WHEN QuoteNoteNumber = 1 THEN NoteAreaID END), 
     [NoteAreaID2] = MAX(CASE WHEN QuoteNoteNumber = 2 THEN NoteAreaID END), 
     [NoteAreaID3] = MAX(CASE WHEN QuoteNoteNumber = 3 THEN NoteAreaID END), 
     [NoteAreaDesc1] = MAX(CASE WHEN QuoteNoteNumber = 1 THEN NoteAreaDesc END), 
     [NoteAreaDesc2] = MAX(CASE WHEN QuoteNoteNumber = 2 THEN NoteAreaDesc END), 
     [NoteAreaDesc3] = MAX(CASE WHEN QuoteNoteNumber = 3 THEN NoteAreaDesc END) 
FROM QuoteNotes 
GROUP BY QuoteID; 

Example on SQL Fiddle

또는

WITH QuoteNotes AS 
( SELECT QuoteNote.QuoteNoteID, 
      Quote.QuoteID, 
      QuoteNote.Note, 
      QuoteNote.NoteAreaID, 
      [NoteAreaDesc] = QuoteNote.Description, 
      [QuoteNoteNumber] = ROW_NUMBER() OVER(PARTITION BY Quote.QuoteID ORDER BY QuoteNote.QuoteNoteID) 
    FROM Quote 
      INNER JOIN QuoteNote 
       ON QuoteNote.QuoteID = Quote.QuoteID 
) 
SELECT q1.QuoteID, 
     [Note1] = q1.Note, 
     [Note2] = q2.Note, 
     [Note3] = q3.Note, 
     [NoteAreaID1] = q1.NoteAreaID, 
     [NoteAreaID2] = q2.NoteAreaID, 
     [NoteAreaID3] = q3.NoteAreaID, 
     [NoteAreaDesc1] = q1.NoteAreaDesc, 
     [NoteAreaDesc2] = q2.NoteAreaDesc, 
     [NoteAreaDesc3] = q3.NoteAreaDesc 
FROM QuoteNotes q1 
     LEFT JOIN QuoteNotes q2 
      ON q1.QuoteID = q2.QuoteID 
      AND q2.QuoteNoteNumber = 2 
     LEFT JOIN QuoteNotes q3 
      ON q1.QuoteID = q3.QuoteID 
      AND q3.QuoteNoteNumber = 3 -- changed this to be 3 
WHERE q1.QuoteNoteNumber = 1; 

모두 동일한 결과를 산출한다

, 그러나 1 다른 것보다 더 잘 수행 할 수 있습니다.

Example on SQL Fiddle

+0

임시 테이블과 3 개의 인스턴스가있는 것을 염두에 두지 않았습니다. – CR41G14

+0

때때로 나무에 나무가 보이지 않습니다 ... – GarethD

관련 문제