2016-03-14 4 views
1

У меня есть таблица DataDefinitions. Я написал запрос, чтобы получить данные из этой таблицы в следующем формате:Данные сводной таблицы с именами разделенных столбцов в SQL Server

enter image description here

, но я хочу, чтобы отделить общее название части в Name столбцов и результат поворота данных, чтобы получить записи в следующем формате:

enter image description here

Пожалуйста, помогите мне, как это сделать в хранимой процедуре SQL Server.

Мой запрос, чтобы получить первую таблицу в

SELECT 
    d.Name 
    , r.latestValueDec AS value 
FROM IDReadingLatestValues r 
JOIN DataDefinitions d ON r.dataDefinitionId = d.dataDefinitionId 
+1

Просим предоставить запрос – Devart

+1

Всегда ли это 3 фазы? или может быть неограниченное количество? – sagi

+0

Да, это всегда до фазы C, т. Е. Трех фаз – VIVEK

ответ

1

Если его всегда до трех фаз можно использовать условную агрегацию так:

SELECT replace(replace(replace(t.name,'Phase A',''),'Phase B',''),'Phace C','') as name, 
     max(CASE WHEN s.latestValueDesc like '%Phase A' then s.latestValueDesc end) as Phase_A, 
     max(CASE WHEN s.latestValueDesc like '%Phase B' then s.latestValueDesc end) as Phase_B, 
     max(CASE WHEN s.latestValueDesc like '%Phase C' then s.latestValueDesc end) as Phase_C 
FROM IDReadingLatestValues s 
JOIN DataDefinitions t 
ON s.dataDefinitionId = t.dataDefinitionId 
GROUP BY replace(replace(replace(t.name,'Phase A',''),'Phase B',''),'Phace C','') 

Я уверен, что есть симпатичнее способ сделать это, но он должен работать как вы ожидаете.

+0

спасибо sagi. Он работает – VIVEK

+0

Нет проблем :) @VIVEK – sagi

1

Уродливый, но работа ...

SELECT 
    Name = SUBSTRING(d.Name, 1, PATINDEX('%Phase%', d.Name) 
    , [Phase A] = SUM(CASE WHEN d.Name LIKE '%Phase A' THEN r.latestValueDec END) 
    , [Phase B] = SUM(CASE WHEN d.Name LIKE '%Phase B' THEN r.latestValueDec END) 
    , [Phase C] = SUM(CASE WHEN d.Name LIKE '%Phase C' THEN r.latestValueDec END) 
FROM dbo.IDReadingLatestValues r 
JOIN dbo.DataDefinitions d ON r.dataDefinitionId = d.dataDefinitionId 
GROUP BY SUBSTRING(d.Name, 1, PATINDEX('%Phase%', d.Name) 

PS. Пожалуйста, нормализовать данные ...

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