2016-08-20 3 views
2

У меня есть таблица с двумя столбцами я заинтересован в.Возврат SQL данные из одного столбца в несколько столбцов

Один столбец является дата, и другой являются тэгами.

Я хотел бы вернуть теги в разные столбцы, сопоставленные с той же датой.

Я могу добиться этого с помощью подзапросов, но есть ли более эффективный способ сделать это? Я говорю о том, чтобы получить около 20-30 тыс. Строк, что приводит к примерно 300 000 запросам

Что является наиболее эффективным способом вставки, чтобы обеспечить соответствие даты друг другу.

Это мой запрос на данный момент. (Мне нужно значение для каждого тэга выстраиваться в строке)

Спасибо

SELECT ah1.DateTime,ah1.Value as TPH, 
(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM1_NXG.NXG_I' 
and datetime = ah1.DateTime 
) as EM1_Current, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM2_NXG.NXG_I' 
and datetime = ah1.DateTime 
) as EM2_Current, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM1_NXG.NXG_SPEED' 
and datetime = ah1.DateTime 
) as EM1_Speed, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM2_NXG.NXG_SPEED' 
and datetime = ah1.DateTime 
) as EM2_Speed, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM1_NXG.NXG_P' 
and datetime = ah1.DateTime 
) as EM1_Power, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM2_NXG.NXG_P' 
and datetime = ah1.DateTime 
) as EM2_Power, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM1_NXG.NXG_TRQ' 
and datetime = ah1.DateTime 
) as EM1_Torque, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM2_NXG.NXG_TRQ' 
and datetime = ah1.DateTime 
) as EM2_Torque, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM1_NXG.NXG_TRQ_UTIL' 
and datetime = ah1.DateTime 
) as EM1_Torque_U, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_EM2_NXG.NXG_TRQ_UTIL' 
and datetime = ah1.DateTime 
) as EM2_Torque_U, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_TE754001G.PVAI' 
and datetime = ah1.DateTime 
) as EM1_NDE, 

(select value 
from dbo.AnalogHistory 
where tagname = 'LS_TE754001H.PVAI' 
and datetime = ah1.DateTime 
) as EM1_DE 

    FROM [Runtime].[dbo].[AnalogHistory] ah1 
    where TagName = 'CR_WQI752010.PVAI' 
    and wwResolution = '600000' 
    and DateTime > '20160816' 
    and wwRetrievalMode = 'cyclic' 

ответ

3

Возможно, вы можете использовать условную агрегацию. Что-то вроде этого:

select datetime, 
     max(case when tagname = 'LS_EM1_NXG.NXG_I' then value end) as val1, 
     . . . 
from dbo.AnalogHistory 
group by datetime ; 
0

Вы можете использовать СЛУЧАЙ, как показано ниже ..

select 
    case when tagname = 'LS_EM1_NXG.NXG_I' 
    and datetime = ah1.DateTime then value end as em1 
    --do for all tags 
    from 
    table 
    FROM [Runtime].[dbo].[AnalogHistory] ah1 
    where wwResolution = '600000' 
    and DateTime > '20160816' 
    and wwRetrievalMode = 'cyclic' 
0
SELECT 
date(datetime) as d, 
(select 
     group_concat(tagname) 
    from 
     dbo.AnalogHistory 
    where 
     date(datetime) = d 
     group by date(datetime))as res 
FROM 
dbo.AnalogHistory 
group by date(datetime); 
Смежные вопросы