преобразовать строки в порядок столбцов по другому столбцу на сервере SQL - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь преобразовать эту таблицу

ID  TestID  Elapsed ActionID
===================================
1   1         16    a1
2   1         17    a2
3   1         13    a3  
4   1         14    a4
5   2         19    a1
6   2         21    a2
7   2         11    a3
8   2         22    a4

К этому

TestID  a1  a2  a3  a4
======================================
1       16  17  13  14
2       19  21  11  22

это возможно?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Да, если для каждого теста есть только один идентификатор действия

Существует оператор поворота, о котором упоминал Аджо, но я думаю, что традиционный синтаксис легче понять (если не сразу очевиден).

Вы группируете строки по testid, поэтому вы получите один ряд результатов для каждого testid.То, что вы выбираете, это «max» в каждой группе, где определено значение acitionid.Или мин, или среднее, или сумма - это основано на том, что в каждой группе есть только один элемент.

 SELECT testid,
   MAX(CASE WHEN actionid = 'a1' THEN elapsed ELSE null END) AS a1,
   MAX(CASE WHEN actionid = 'a2' THEN elapsed ELSE null END) AS a2,
   MAX(CASE WHEN actionid = 'a3' THEN elapsed ELSE null END) AS a3,
   MAX(CASE WHEN actionid = 'a4' THEN elapsed ELSE null END) AS a4
FROM results
GROUP BY testid
1 голос
/ 23 ноября 2011

Если вы используете SQL Server 2005 (или выше), вот запрос с подтверждением концепции.Наслаждайтесь:

--Proof of concept structure and data creation
create table #t (ID int, TestID int, Elapsed int, ActionID varchar(10))

insert into #t  (ID, TestID, Elapsed, ActionID) values
(1,   1,         16,    'a1'),
(2,   1,         17,    'a2'),
(3,   1,         13,    'a3'),
(4,   1,         14,    'a4'),
(5,   2,         19,    'a1'),
(6,   2,         21,    'a2'),
(7,   2,         11,    'a3'),
(8,   2,         22,    'a4');
--end of structure and data creating

--actual query starts here
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)

SELECT  @cols = STUFF(( SELECT distinct  ',' + QuoteName([ActionID])
                        FROM #t  FOR XML PATH('') ), 1, 1, '') 

SET @sqlquery = 'SELECT * FROM
      (SELECT TestID, Elapsed, ActionID
       FROM #t  ) base
       PIVOT (SUM(Elapsed) FOR [ActionID]
       IN (' + @cols + ')) AS finalpivot'

--Depending on your approach, you might want to use MAX instead of SUM. 
--That will depend on your business rules

EXECUTE ( @sqlquery )
--query ends here


--proof of concept cleanup
drop table #t;

Это будет работать независимо от того, сколько разных значений у вас в ActionID.Он динамически собирает запрос с PIVOT.Единственный способ сделать PIVOT с динамическими столбцами - это динамически собрать запрос, что можно сделать в SQL Server.

Другие примеры:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...