2014-02-11 5 views
0

Я использовал примеры из Stack Overflow, чтобы попытаться понять функцию PIVOT, например; Convert Rows to columns using 'Pivot' in mssqlT-SQL с использованием PIVOT

До сих пор я придумал следующий образец;

CREATE table #rawTable (id int, header varchar(20), visitId int, performedWhen DateTime, recordedValue varchar(20)) 

    INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (10,'Blood Pressure', 1,'1 Jan 2014 10:10','110/85') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (11,'Heart Rate', 1,'1 Jan 2014 10:10','75') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (12,'Temperature', 1,'1 Jan 2014 10:10','36.9') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (10,'Blood Pressure', 2,'1 Jan 2014 14:35','120/70') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (10,'Blood Pressure', 3,'2 Jan 2014','110/80') 


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

    select @cols = STUFF((select ',' + QUOTENAME(convert(varchar(17), performedWhen, 113)) 
          from #rawTable 
         group by performedWhen 
         order by performedWhen 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
      ,1,1,'') 

    set @query = 'select header, ' + @cols + ' from 
       (
        select id, header, visitId, performedWhen, recordedValue 
        from #rawTable 
       ) x 
       pivot 
       (
        max(recordedValue) 
        for performedWhen in (' + @cols + ') 
       ) p' 

    EXEC sp_executesql @query 

    DROP table #rawTable 

Это произведет следующий результат;

Header   01 Jan 2014 10:10 01 Jan 2014 14:35 02 Jan 2014 00:00 
--------------------------------------------------------------------------- 
Blood Pressure 110/85    NULL    NULL 
Blood Pressure NULL    120/70   NULL 
Blood Pressure NULL    NULL    110/80 
Heart Rate 75 NULL    NULL    NULL 
Temperature 36.9 NULL    NULL    NULL 

Что мне действительно нужно, это результат (i.e) ALl значения «артериального давления» на одной линии;

Header   01 Jan 2014 10:10 01 Jan 2014 14:35 02 Jan 2014 00:00 
--------------------------------------------------------------------------- 
Blood Pressure 110/85    120/70    110/80 
Heart Rate   75    NULL    NULL 
Temperature   36.9    NULL    NULL 

Я не ищу ответа, только ключ, чтобы указать меня в правильном направлении, я просто не могу получить мою голову вокруг этого. :)

Версия SQL Server - 2012 Enterprise.

+0

Когда вы применяете функцию 'PIVOT', в каждом столбце ваш внутренний список выбора, который не используется в сводной части, будет« сгруппирован по ». Вы можете выяснить проблему, используя 'select *' в своем окончательном списке выбора. У вас есть столбец, который сгруппирован по тому, что является уникальным и вызывает несколько строк. _hint: visitid_ – Taryn

+0

Спасибо, что научил меня рыбе;). Группировка получила меня ... – Damo

+0

хорошо, что вы сказали, что хотите найти ключ к правильному пути. – Taryn

ответ

1

Функция PIVOT automatically сделать что-то вроде group by в выбранном пункте, если вы не нуждаетесь в visitId поле, просто измените свой запрос:

set @query = 'select header, ' + @cols + ' from 
      (
       select id, header, performedWhen, recordedValue 
       from #rawTable 
      ) x 
      pivot 
      (
       max(recordedValue) 
       for performedWhen in (' + @cols + ') 
      ) p' 
+0

+1 к этому ответу. Он работает @ http://sqlfiddle.com/#!6/a72d8/13 –

+0

Хорошо, я вижу. Я думаю, что могу предоставить необходимые функции без посещения. Ваша помощь очень ценится. – Damo

0

Попробуйте этот запрос, я просто удалил visitid от select select

CREATE table #rawTable (id int, header varchar(20), visitId int, performedWhen DateTime, recordedValue varchar(20)) 

INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (10,'Blood Pressure', 1,'1 Jan 2014 10:10','110/85') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (11,'Heart Rate', 1,'1 Jan 2014 10:10','75') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (12,'Temperature', 1,'1 Jan 2014 10:10','36.9') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (10,'Blood Pressure', 2,'1 Jan 2014 14:35','120/70') 
INSERT INTO #rawTable (id, header, visitId, performedWhen, recordedValue) VALUES (10,'Blood Pressure', 3,'2 Jan 2014','110/80') 





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

select @cols = STUFF((select ',' + QUOTENAME(convert(varchar(17), performedWhen, 113)) 
from #rawTable 
group by performedWhen 
order by performedWhen 
FOR XML PATH(''), TYPE 
).value('.', 'NVARCHAR(MAX)') 
,1,1,'') 

set @query = 'select header, ' + @cols + ' from 
(
select id, header, performedWhen, recordedValue 
from #rawTable 
) x 
pivot 
(
max(recordedValue) 
for performedWhen in (' + @cols + ') 
) p' 

EXEC sp_executesql @query 
print @query 

DROP table #rawTable 
Смежные вопросы