2014-08-28 69 views
1

好的。我編輯我的問題。這是我的腳本:將多行轉換爲列編輯

CREATE TABLE #Table (
    Data Date, 
    Max_Temp Real, 
    Min_Temp Real, 
    Sr_Temp Real, 
    Sr_Temp_work Real) 

    SET NOCOUNT ON 
    DECLARE @StartTime Time 
    DECLARE @EndTime Time 
    DECLARE @StartTime1 Time 
    DECLARE @EndTime1 Time 
    DECLARE @data_start Date 
    DECLARE @data_stop Date 
    DECLARE @Data Date 
    DECLARE @Data_stop_while Date 
    DECLARE @Max_Temp Real 
    DECLARE @Min_Temp Real 
    DECLARE @Sr_Temp Real 
    DECLARE @Sr_Temp_work Real 


    SET @data_start = '20140713' 
    SET @data_stop = '20140719' 
    SET @StartTime = '00:00:00.000' 
    SET @EndTime = '23:59:59.998' 
    SET @StartTime1 = '08:00:00.000' 
    SET @EndTime1 = '16:30:00.000' 
    Set NOCOUNT OFF 

    SELECT @Data = @data_start 

    SELECT @Data_stop_while = DATEADD(day,1,@data_stop) 

    WHILE (@Data_stop_while<>@Data) 
    BEGIN 

    SELECT @Max_Temp = MAX(Value), @Min_Temp = MIN(Value), @Sr_Temp = AVG(Value) FROM INSQL.Runtime.dbo.History WHERE TagName IN ('VariableName') 
    and wwRetrievalMode = 'Cyclic' 
    AND DateTime >= (@Data + cast(@StartTime as datetime)) 
    AND DateTime <= (@Data + cast(@EndTime as datetime)) 


    SELECT @Sr_Temp_work = AVG(Value) FROM INSQL.Runtime.dbo.History WHERE TagName IN ('VariableName') 
    and wwRetrievalMode = 'Cyclic' 
    AND DateTime >= (@Data + cast(@StartTime1 as datetime)) 
    AND DateTime <= (@Data + cast(@EndTime1 as datetime)) 


    INSERT INTO #Table(Data, Max_Temp, Min_Temp, Sr_Temp, Sr_Temp_work) VALUES (@Data, @Max_Temp, @Min_Temp, @Sr_Temp, @Sr_Temp_work) 

    SELECT @Data = DATEADD(day,1,@Data) 

    END 

    SELECT Data, Max_Temp, Min_Temp, Sr_Temp, Sr_Temp_work FROM #Table GO 

當我設置一個特定的時間間隔,我有這些表,現在我需要轉換的表:

enter image description here

我用支點,UNPIVOT與任何鏈接論壇和我不能這樣做...

+0

請把實際的代碼,而不是腳本的形象.. – 2014-08-28 09:13:56

+0

還向我們展示了預期的輸出... – 2014-08-28 09:16:08

+0

請張貼實際的代碼 – Adi 2014-08-28 09:20:28

回答

1

其實你需要使用動態透視和逆透視在一起。檢查以下查詢。使用到位,最後選擇查詢的下面的代碼在你的程序中

DECLARE @Columns NVARCHAR(MAX) 
DECLARE @MainQuery NVARCHAR(MAX) 
SELECT @Columns = ISNULL(@Columns + ',','') + QUOTENAME(CONVERT(VARCHAR(10),Data,20)) 
FROM (SELECT DISTINCT Data FROM #Table) C 
SET @MainQuery ='SELECT [Temperature],' + @Columns + ' 
FROM 
(
    SELECT Data,Max_Temp,Min_Temp,Sr_Temp,Sr_Temp_work 
    FROM #Table 
) as T 
UNPIVOT 
(
    Value FOR [Temperature] in (Max_Temp,Min_Temp,Sr_Temp,Sr_Temp_work) 
) AS U 
PIVOT 
(
    MAX(Value) FOR [Data] IN ('+ @Columns +') 
) as P 
' 

EXEC sp_executesql @MainQuery 
+0

非常感謝。我在我的過程中使用了下面的代碼來代替最後一個選擇查詢,並且沒有響應(沒有錯誤,沒有轉換)。我不知道爲什麼。但我在我的腳本中使用代碼(沒有我的過程)是好的 - 首先是舊錶,然後是轉換表:[link](http://i62.tinypic.com/1yo281.png) – Mini 2014-08-28 14:22:47

1

這是迄今爲止最優雅的解決方案,但與一些動態SQL,你應該能夠複製的邏輯。

DECLARE @temp TABLE (
    Data DATE, 
    Max_temp FLOAT, 
    Min_Temp FLOAT, 
    Sr_Temp FLOAT, 
    Sr_Temp_work FLOAT 
) 

INSERT INTO @temp 
select 
* 
from (values 
    ('2014-07-13',25.8,25.6,25.701,25.668), 
    ('2014-07-14',26.8,26.6,26.701,26.668), 
    ('2014-07-15',27.8,27.6,27.701,27.668), 
    ('2014-07-16',28.8,28.6,28.701,28.668))T (Data,Max_temp,Min_Temp,Sr_Temp, Sr_Temp_work) 
SELECT 
     Data, 
     Max_temp, 
     Min_Temp, 
     Sr_Temp, 
     Sr_Temp_work 
FROM @temp 


SELECT 
    'Max_temp' Temperature, 
    MAX([2014-07-13])[2014-07-13], 
    MAX([2014-07-14])[2014-07-14], 
    MAX([2014-07-15])[2014-07-15], 
    MAX([2014-07-16])[2014-07-16] 
FROM 
(
    SELECT 
     Data, 
     Max_temp, 
     Min_Temp, 
     Sr_Temp, 
     Sr_Temp_work 
    FROM @temp 
) SRC 
PIVOT (
    MAX(Max_temp) 
    FOR Data IN ([2014-07-13],[2014-07-14],[2014-07-15],[2014-07-16]) 
) AS pvt 
UNION ALL 
SELECT 
    'Min_Temp' Temperature, 
    MAX([2014-07-13])[2014-07-13], 
    MAX([2014-07-14])[2014-07-14], 
    MAX([2014-07-15])[2014-07-15], 
    MAX([2014-07-16])[2014-07-16] 
FROM 
(
    SELECT 
     Data, 
     Max_temp, 
     Min_Temp, 
     Sr_Temp, 
     Sr_Temp_work 
    FROM @temp 
) SRC 
PIVOT (
    MAX(Min_Temp) 
    FOR Data IN ([2014-07-13],[2014-07-14],[2014-07-15],[2014-07-16]) 
) AS pvt 
UNION ALL 
SELECT 
    'Sr_Temp' Temperature, 
    MAX([2014-07-13])[2014-07-13], 
    MAX([2014-07-14])[2014-07-14], 
    MAX([2014-07-15])[2014-07-15], 
    MAX([2014-07-16])[2014-07-16] 
FROM 
(
    SELECT 
     Data, 
     Max_temp, 
     Min_Temp, 
     Sr_Temp, 
     Sr_Temp_work 
    FROM @temp 
) SRC 
PIVOT (
    MAX(Sr_Temp) 
    FOR Data IN ([2014-07-13],[2014-07-14],[2014-07-15],[2014-07-16]) 
) AS pvt 
UNION ALL 
SELECT 
    'Sr_Temp_work' Temperature, 
    MAX([2014-07-13])[2014-07-13], 
    MAX([2014-07-14])[2014-07-14], 
    MAX([2014-07-15])[2014-07-15], 
    MAX([2014-07-16])[2014-07-16] 
FROM 
(
    SELECT 
     Data, 
     Max_temp, 
     Min_Temp, 
     Sr_Temp, 
     Sr_Temp_work 
    FROM @temp 
) SRC 
PIVOT (
    MAX(Sr_Temp_work) 
    FOR Data IN ([2014-07-13],[2014-07-14],[2014-07-15],[2014-07-16]) 
) AS pvt 

不同的注意!

通過行不使用行..

DECLARE 
    @data_start Date = '2014-07-13', 
    @data_stop Date = '2014-07-19' 

SELECT 
    [DateTime] Data 
    MAX(Value) Max_temp, 
    MIX(Value) Min_temp, 
    AVG(Value) Sr_Temp 
    AVG(case when CONVERT(TIME(7),DateTime) between '08:00:00.000' and '16:30:00.000' then Value else NULL end) Sr_Temp_work 
FROM INSQL.Runtime.dbo.History 
WHERE 
    TagName IN ('VariableName') and 
    wwRetrievalMode = 'Cyclic' AND 
    CONVERT(DATE, Datetime) between @data_start and @data_stop 
+0

謝謝你的回答,但不是重點..特別是我把代碼。在Microsoft Report Services中,我選擇了時間間隔。它不一定只有4天。 atdata_start和atdata_stop-我更改此值 – Mini 2014-08-28 10:05:25

+0

如果目標是用於報告服務,那麼起始查詢就足夠了,只需使用Matrix並向列組添加日期並從那裏開始工作。 – mxix 2014-08-28 10:09:48

+0

atdata_start和atdata_stop-我更改此值並值25.8,25.6,25.701,25.668等是從數據庫中的VariableName中選擇的 – Mini 2014-08-28 10:12:57