2013-04-30 3 views
1

У меня есть DataTable, какSQL Query все записи в одной строке

CANDID QID OptID 
11  56 116 
11  56 117 
11  57 118 
11  57 119 
11  60 124 
11  60 125 
11  60 126 
11  62 129 
11  62 130 
11  62 131 

Как я могу отобразить эти данные как

CANDID QID OptID1 OptID2 OptID3 OptID4 
11  56  116  117  null  null 
.... 
.... 

11  60  124  125  126  null 

Я попытался это, но это не мой желаемый результат.

SELECT CANDID, 
     QID, 
     MIN(OptID) AS OptID1, 
     MAX(OptID) AS OptID4 
FROM #TEMP1 
GROUP BY CANDID, 
      QID 
+0

Я сомневаюсь, что это будет когда-либо возможно , по крайней мере, не так легко, так как вы использовали вектор-строку, и теперь вы хотите проектировать данные так, как если бы они находились внутри столбца-вектора. – shazin

+0

Какую систему баз данных вы используете? –

+0

Возможный дубликат [SQL Server Join with Latest 2 Entries] (http://stackoverflow.com/questions/9243368/sql-server-join-with-latest-2-entries) –

ответ

1
CREATE TABLE #TEMP1 
    ([CANDID] int, [QID] int, [OptID] int) 
; 

INSERT INTO #TEMP1 
    ([CANDID], [QID], [OptID]) 
VALUES 
    (11, 56, 116), 
    (11, 56, 117), 
    (11, 57, 118), 
    (11, 57, 119), 
    (11, 60, 124), 
    (11, 60, 125), 
    (11, 60, 126), 
    (11, 62, 129), 
    (11, 62, 130), 
    (11, 62, 131) 
; 

WITH T 
    AS (SELECT [CANDID], 
       [QID], 
       [OptID], 
       ROW_NUMBER() OVER (PARTITION BY [CANDID], [QID] ORDER BY [OptID]) AS RN 
     FROM #TEMP1) 
SELECT CANDID, 
     QID, 
     [1] AS OptID1, 
     [2] AS OptID2, 
     [3] AS OptID3, 
     [4] AS OptID4 
FROM T PIVOT (MAX([OptID]) FOR RN IN ([1], [2], [3], [4])) AS P 


DROP TABLE #TEMP1 

Возвращает

CANDID  QID   OptID1  OptID2  OptID3  OptID4 
----------- ----------- ----------- ----------- ----------- ----------- 
11   56   116   117   NULL  NULL 
11   57   118   119   NULL  NULL 
11   60   124   125   126   NULL 
11   62   129   130   131   NULL 
+0

Большое спасибо Мартину. Это безупречно работает. Я провел почти один день, чтобы добиться того, что вы сделали менее чем за 10 минут. – user1132134

+0

Martin Пожалуйста, не могли бы вы рассказать мне, как добавить option_text со всеми параметрамиId (OptID). Я пробовал этот путь, но не – user1132134

+0

Привет, Мартин, мне нужно добавить еще один столбец рядом с OPTID, который является описанием опции. это означает, что каждый optid имеет свое собственное descrption, пожалуйста, не могли бы вы рассказать мне, как отобразить этот столбец. – user1132134

0

Это то, что вы ищете:

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.OptID) 
      FROM #TEMP1 c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'')   

SET @query = 'SELECT CANDID, QID, ' + @cols + ' from 
      (
       select CANDID 
        , QID 
        , OptID 
       from #TEMP1 
      ) x 
      pivot 
      (
       AVG(OptID) 
       for OptID in (' + @cols + ') 
      ) p ' 

EXECUTE(@query) 

Возвращает

CANDID  QID   116   117   118   119   124   125   126   129   130   131 
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
11   56   116   117   NULL  NULL  NULL  NULL  NULL  NULL  NULL  NULL 
11   57   NULL  NULL  118   119   NULL  NULL  NULL  NULL  NULL  NULL 
11   60   NULL  NULL  NULL  NULL  124   125   126   NULL  NULL  NULL 
11   62   NULL  NULL  NULL  NULL  NULL  NULL  NULL  129   130   131 
+0

Большое спасибо Мартину. Это безупречно работает. Я провел почти один день, чтобы добиться того, что вы сделали менее чем за 10 минут. – user1132134

+0

Привет, Azeem, я должен добавить еще один столбец рядом с OPTID, который является описанием опции. это означает, что у каждого оптика есть своя дескрипция, пожалуйста, не могли бы вы рассказать мне, как это сделать. – user1132134

Смежные вопросы