2015-02-13 3 views
-1

Я знаю, как сделать стержень, но я столкнулся с проблемой, которую я не могу понять. У меня есть этот набор данных, который содержит «Сайт» в виде текста (строки-вертикали), Q1, Q2, Q3, Q4, Q5, Q6, Q7 в процентах (%) всего (по горизонтали столбца), и моя проблема в том, что я хочу для отображения сайта в качестве столбца и от Q1 до Q7 в виде строки, и я просто не могу понять, как это сделать. Может кто-нибудь мне помочь?Convert Row To Column, отображающий процентные доли

Спасибо.

+1

Некоторых выборочных данных, желаемый результата и ваши попытки до сих пор было бы хорошо !! –

+0

Просьба предоставить код для того, что вы пытались решить до сих пор. Сейчас это происходит, потому что вы просто хотите, чтобы кто-то написал код для вас, даже не пытаясь сделать это самостоятельно. – MattD

+0

выберите * в #a из (выберите s.Site, s.Q1, s.Q2, s.Q3, s.Q4 s.Q5, s.Q6, s.Q7 из tbl s) как x PIVOT (count (surveyid) для [monthday] в [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11] , [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [ 24], [25], [26], [27], [28], [29], [30], [31])) - я хочу заменить дни сайта. – Arsee

ответ

1

Его не очень понятный ожидаемый результат с вашего вопроса. Но так как ты просил

Я хочу, чтобы отобразить сайт в качестве колонки и Q1 до Q7 в виде ряда

вам нужно принести столбцы как строки и преобразовать строку в столбцы. Для этого вам нужно сначала unpivot, а затем развернуться дальше.

Примечание: Имя столбца таблицы и таблицы образцов может отличаться. Но следуйте подходу, который я использовал.

ОБРАЗЦА ТАБЛИЦА

CREATE TABLE #TEMP([SITE] VARCHAR(10),Q1 INT,Q2 INT,Q3 INT,Q4 INT,Q5 INT,Q6 INT,Q7 INT) 

INSERT INTO #TEMP 
SELECT 'A',1,3 ,4,2,7,8,9 
UNION ALL 
SELECT 'B',2,6 ,9,4,8,11,12 
UNION ALL 
SELECT 'C',10,3 ,2,5,6,4,9 

QUERY

Вы можете использовать CROSS APPLY в unpivot столбцы в строки.

(a) Когда значения в строках известны заранее, вы можете использовать статический стержень.

SELECT * FROM 
(
    SELECT [SITE],VAL,COLNAME 
    FROM #TEMP 
    CROSS APPLY(VALUES (Q1,'Q1'),(Q2,'Q2'),(Q3,'Q3'),(Q4,'Q4'),(Q5,'Q5'),(Q6,'Q6'),(Q7,'Q7')) 
    COLUMNNAMES(VAL,COLNAME) 
)R 
PIVOT 
( 
    MIN(VAL) 
    for [SITE] in ([A],[B],[C]) 
)AS P 

- Click here для просмотра результата

(б) Когда значения в строке в заранее неизвестно, можно использовать динамический стержень.

-- Get the values in the row and store in a variable 
DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + [SITE] + ']', '[' + [SITE] + ']') 
       FROM (SELECT DISTINCT [SITE] FROM #TEMP) PV 
       ORDER BY [SITE] 

-- Convert the values to dynamic number of columns  
DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT [SITE],VAL,COLNAME 
       FROM #TEMP 
       CROSS APPLY(VALUES (Q1,''Q1''),(Q2,''Q2''),(Q3,''Q3''), 
            (Q4,''Q4''),(Q5,''Q5''),(Q6,''Q6''),(Q7,''Q7'')) 
       COLUMNNAMES(VAL,COLNAME) 
      ) x 
      PIVOT 
      (
       MIN(VAL) 
       FOR [SITE] in (' + @cols + ') 
      ) p 
      ORDER BY COLNAME;' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результата