2017-04-12 9 views
1

のMicrosoft SQL 2008R2SQLピボット複数は(15)の値は、

私は複数の値を持つすべてのピボット・ポスト、ピボットを検討しようとしているだけで4列に戻ったが、何も私は必要なものであるように思わない - これは最も近いかもしれDisplaying multiple values into columns in sql server using pivot - しかし、悲しいことに "結果"がないので、私は確信が持てません。

私の質問私は、私は2つのテーブル

GALFP 16421行、かなり静的な新しい部屋を作成(または人口)を取得しますように照会していますより多くの値が追加されたデータベースを持ってい

- 現在Iここでは15行にしか興味がありません(下のグレーでさらにご覧ください)。しかし、4値のリターンを言っています - 私は4に基づいて報告し、それらが選択されているため4つのクエリが値を気に入って持ってたくさんに

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

で構成されて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行、合計15の組み合わせ。

ので、ここでのクエリの1つの

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 */** 

です:第一のタイプはMinTemp(示すように)で、第二はMaxTemp、第三AvgTemp、第四RelHumidity

そうではなく、4つのクエリを実行しているが、コピー&ペースト - ラベル、日付/時刻、最小値、最大値、平均値、RelHum - (可能であれば)単一のクエリで報告したいもの

Simples私はあなたの言うことを聞いているのですか?ただし、データとクエリが悪くなる - あなたはWHERE句が

バリアントに等を有していることがわかります。だから私は15個の値に旋回した場合、現在の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の列を取得します。私はどの部屋が関係しているかにかかわらず、1つの列にすべてのMin、別のMaxで別のもの、別のもので平均と別の湿度を持つことができる必要があります。私はそのデータからそれを排除することはできません。

はい、私はそれは、そのない私のデザインより良い正規化されている可能性が:(

任意のアイデアは?事前にありがとうございます知っている!

答えて

0

あなたが望むものに近づくために、条件付き集約を使用することができます。なければサンプルデータは、私がgalfp.PointLabelのどのような私ができるあなたの例からの値で働いていた。

あなたが与えられたpvroomdatatime、その後、以下の集計が簡単に削除しているヌルのための単一のデータポイントを持っている場合。

likeの比較を使用するように日付を文字列に変換する代わりに、dateadd(month, datediff(month, 0, pv.DataTime), 0)を使用して日付を1か月に切り捨てて、希望の月を比較することができます。

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) 
関連する問題