2013-02-08 39 views
3

我有一个报价,我想要将最后3个注释转换为单行。通过从报价选择前3名我有一个QuoteNote表:将3行转换为一行

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

我对这个表中选择这让我想起我需要

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 

这给了我

QuoteNoteID  QuoteID  Note  NoteAreaID  NoteAreaDesc 
    1    1   Test   2    Internal 
    2    1   Test2   1    External 
    3    1   Test3   1    External 
信息

现在我想要做的就是将其放入一行

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; 

双方应产生相同的结果,但一可能比另一个表现更好。

Example on SQL Fiddle

+0

甚至没有跨过我的想法有一个临时表和3个实例,感谢 – CR41G14

+0

有时我们不能看到树木的木材... – GarethD