2016-08-20 3 views
2

Ich habe eine Tabelle mit zwei Spalten wir interessiert sind.Return SQL-Daten aus einer einzigen Spalte in mehrere Spalten

Eine Spalte ein Datum ist, und die andere sind Tagnamen.

Ich möchte die Tagnamen in verschiedenen Spalten mit dem gleichen Datum übereinstimmen.

Ich kann dies mit Unterabfragen erreichen, aber gibt es eine effizientere Möglichkeit, dies zu tun? Ich spreche über das Abrufen von etwa 20-30k Zeilen, die zu etwa 300.000 Abfragen führt

Was ist die effizienteste Art der Auswahl einfügen, um sicherzustellen, dass das Datum miteinander in Einklang steht.

Dies ist meine Abfrage im Moment. (Ich brauche den Wert für jeden Tag-Namen in der Reihe zu bilden)

Danke

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' 

Antwort

3

Vielleicht können Sie bedingte Aggregation verwenden. Etwas wie folgt aus:

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

Sie können CASE wie unten verwenden ..

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); 
Verwandte Themen