2017-04-12 18 views
1

微軟SQL 2008R2SQL樞軸多(15)值返回,在短短4列

我已經嘗試了審查所有的樞轉柱,短線有多個值,但沒有什麼似乎是我所需要的 - 這可能是最接近Displaying multiple values into columns in sql server using pivot - 但遺憾的是沒有「結果」,所以我不能肯定。

我的問題

我有我在哪裏查詢2個表

GALFP 16421行,相當靜態的一個新的空間被創建(或填充)多個值增加了一個數據庫 - 目前我我只對這裏的15行感興趣(見下面的灰色部分)。

siteLabel    nvarchar 255 
siteConnectionString nvarchar 255 
LanNo     smallint NULL 
NodeAddress    smallint NULL 
LanLabel    nvarchar 255 
OSLabel     nvarchar 255 
PointLabel    nvarchar 255 
item     nvarchar 255 
pointID     int   NULL 

PV 23496777行,成長很多這是由

PointID   int   NULL 
DataTime  datetime NULL 
DataValue  float  NULL 
DataValueType tinyint  NULL 
DataValueStatus tinyint  NULL 

我有4個查詢,報告和他們選擇基於4喜歡值每15分鐘 - 但4喜歡價值迴歸共有15個組合;

因此,這裏的查詢

SELECT GALFP.PointLabel, PV,DataTime, ROUND(PV,DataValue, 2) AS MinTemp **/* See note about the 4 values */** 
FROM PL INNER JOIN GALFP ON PV,PointID = GALFP.pointID 
WHERE convert(VARCHAR(10), PV.DataTime,110) like '03%2017' AND 
    (GALFP.PointLabel LIKE N'%Data Hall%Min Temp (15 minute)%')  **/* See note about variants */** 

的1:第1類是MinTemp(如圖所示),第二個是MaxTemp,第3 AvgTemp,第4 RelHumidity

因此,而不是運行4個查詢和複製/粘貼 - 我想回報是標籤,日期/時間,最小值,最大值,平均值,RelHum - 在一個單一的查詢(如果可能)

Simples我聽到你說......支點嗎?然而,數據和查詢變得更糟 - 你可以看到,WHERE子句有一個像它

變種:那麼目前的15倍可能的值是

ALL Room 4 Hum Ave (15 minute) 

Room 1 Min Temp (15 minute) 
Room 2 Min Temp (15 minute) 
Room 3 Min Temp (15 minute) 
Room 5 Min Temp (15 minute) 

Room 1 Max Temp (15 minute) 
Room 2 Max Temp (15 minute) 
Room 3 Max Temp (15 minute) 
Room 5 Max Temp (15 minute) 

Room 1 Hum Ave (15 minute) 
Room 2 Hum Ave (15 minute) 
Room 3 Hum Ave (15 minute) 
Room 4 Hum Ave (15 minute) 
Room 5 Hum Ave (15 minute) 
Room 6 Hum Ave (15 minute) 

所以,如果我轉動的15個值,我得到15列,這不是需要的。我需要能夠擁有所有的民一列中,Max在另一個,平均在另一個溼度在另一個,不管涉及到哪個房間 - 儘管我確實需要知道它是哪個房間,準備報告/圖等等,所以我不能從數據中消除這些。

是的,我知道這可能是更好的標準化,它不是我的設計:(

任何想法?謝謝你在前進!

回答

0

可以使用條件的聚集來接近你想要的東西。如果沒有樣本數據,我曾與galfp.PointLabel我所能從你的示例值。

如果你有一個給定的pvroomdatatime,然後在下面的聚集是簡單地刪除空單數據點。

而不是你的日期轉換爲字符串使用like比較,則可以使用dateadd(month, datediff(month, 0, pv.DataTime), 0)截斷日起一個月和比較,所需月份。

select 
    pv 
    , DataTime 
    , Room = left(galfp.PointLabel,patindex('%[0-9] %',galfp.PointLabel) 
    , MinTemp = max(case when galfp.PointLabel like N'%Min Temp%' then round(pv.DataValue, 2) end) 
    , MaxTemp = max(case when galfp.PointLabel like N'%Max Temp%' then round(pv.DataValue, 2) end) 
    , AvgTemp = max(case when galfp.PointLabel like N'%Avg Temp%' then round(pv.DataValue, 2) end) 
    , HumAve = max(case when galfp.PointLabel like N'%Hum Ave%' then round(pv.DataValue, 2) end) 
from pl 
    inner join galfp on pv.Pointid = galfp.pointid 
where dateadd(month, datediff(month, 0, pv.DataTime), 0) = '20170301' 
group by 
    pv 
    , DataTime 
    , left(galfp.PointLabel,patindex('%[0-9] %',galfp.PointLabel)