[英]PIVOTing data with SQL server
好的,當我什至不知道如何開槍時,我都望而卻步。 我根據Technet基本文章( http://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx )編寫了此SQL。
Select LogTime, Location, LA95Day, LA95Evening, LA95DEn, LA95Night from
(Select LogTime, Location, LAValue, ValueType from Project_5_CalculatedData
where ValueType in ('LA95Day','LA95Evening','LA95DEn','LA95Night') ) as c
PIVOT(
Max(LAValue) For ValueType in (LA95Day,LA95Evening,LA95DEn,LA95Night)) as PVt
我的表結構類似於
DataID Location LogTime LAValue ValueType
10117 Meter1 2012-09-25 00:00:00.000 71.12 LA95Day
10118 Meter1 2012-09-25 00:00:00.000 55.52 LA95Evening
10119 Meter1 2012-09-25 00:00:00.000 52.69 LA95Night
10120 Meter1 2012-09-25 00:00:00.000 68.62 LA95Den
10121 Meter1 2012-09-26 00:00:00.000 72.21 LA95Day
10122 Meter1 2012-09-26 00:00:00.000 54.10 LA95Evening
10123 Meter1 2012-09-26 00:00:00.000 48.30 LA95Night
10124 Meter1 2012-09-26 00:00:00.000 69.38 LA95Den
編輯 :這里的數據不完整..我們有4000行..因此,您可以假設MEter2,Meter3,Meter4的位置將與示例數據中的日期相同或不同。 **編輯結束**
我們最多可以記錄4米,數據ID並不重要。 但是我希望所有儀表數據都對齊,我編寫的上述查詢確實部分起作用,即它顯示數據為:
LogTime Location LA95Day LA95Evening LA95DEn LA95Night
2012-09-25 00:00:00.000 Meter1 71.12 55.52 68.62 52.69
2012-09-26 00:00:00.000 Meter1 72.21 54.10 69.38 48.30
2012-09-27 00:00:00.000 Meter1 68.88 47.77 66.05 46.02
2012-09-28 00:00:00.000 Meter1 73.52 49.23 70.56 43.60
2012-09-29 00:00:00.000 Meter1 54.09 44.87 52.85 41.64
2012-09-30 00:00:00.000 Meter1 51.46 48.61 51.94 41.60
2012-10-01 00:00:00.000 Meter1 73.09 51.78 70.17 46.20
但是我要根據使用的表計; LAday,晚上,Den和晚上最多重復4次; 應用中每米使用一次。 即欲望輸出[列]需要是
LogTime M1-LA95Day M1-LA95Evening M1-LA95DEn M1-LA95Night M2-LA95Day M2-LA95Evening M2-LA95DEn M2-LA95Night M3-LA95Day M3-LA95Evening M3-LA95DEn M3-LA95Night M4-LA95Day M4-LA95Evening M4-LA95DEn M4-LA95Night
哦,我正在嘗試嘗試,因為我以前從未使用過Pivot,甚至不知道我上面的查詢是如何工作的,如果您能解釋一下該查詢將幫助我進行下一步的話。 謝謝。
在我看來,您正在嘗試將所有儀表及其valueTypes
列為列。 如果是這種情況,那么您應該可以使用以下內容:
Select LogTime,
Meter1_LA95Day, Meter1_LA95Evening, Meter1_LA95DEn, Meter1_LA95Night,
Meter2_LA95Day, Meter2_LA95Evening, Meter2_LA95DEn, Meter2_LA95Night,
Meter3_LA95Day, Meter3_LA95Evening, Meter3_LA95DEn, Meter3_LA95Night,
Meter4_LA95Day, Meter4_LA95Evening, Meter4_LA95DEn, Meter4_LA95Night
from
(
Select LogTime,
ValueType = Location+'_'+ValueType,
LAValue
from Project_5_CalculatedData
where ValueType in ('LA95Day','LA95Evening','LA95DEn','LA95Night')
) as c
PIVOT
(
Max(LAValue)
For ValueType in (Meter1_LA95Day, Meter1_LA95Evening, Meter1_LA95DEn, Meter1_LA95Night,
Meter2_LA95Day, Meter2_LA95Evening, Meter2_LA95DEn, Meter2_LA95Night,
Meter3_LA95Day, Meter3_LA95Evening, Meter3_LA95DEn, Meter3_LA95Night,
Meter4_LA95Day, Meter4_LA95Evening, Meter4_LA95DEn, Meter4_LA95Night)
) as PVt;
請注意,這假設儀表實際上被命名為meter1
, meter2
等等。如果您的儀表沒有被稱為meter1
等等,並且它們的名稱可能不相同,那么您可能想要使用動態SQL來獲得結果:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Location+'_'+ValueType)
from Project_5_CalculatedData
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT LogTime,' + @cols + '
from
(
Select LogTime,
ValueType = Location+''_''+ValueType,
LAValue
from Project_5_CalculatedData
where ValueType in (''LA95Day'',''LA95Evening'',''LA95DEn'',''LA95Night'')
) x
pivot
(
max(LAValue)
for ValueType in (' + @cols + ')
) p '
execute sp_executesql @query;
這些將產生結果:
+-------------------------+----------------+----------------+--------------------+------------------+----------------+----------------+--------------------+------------------+----------------+----------------+--------------------+------------------+
| LogTime | Meter1_LA95Day | Meter1_LA95Den | Meter1_LA95Evening | Meter1_LA95Night | Meter2_LA95Day | Meter2_LA95Den | Meter2_LA95Evening | Meter2_LA95Night | Meter3_LA95Day | Meter3_LA95Den | Meter3_LA95Evening | Meter3_LA95Night |
+-------------------------+----------------+----------------+--------------------+------------------+----------------+----------------+--------------------+------------------+----------------+----------------+--------------------+------------------+
| 2012-09-25 00:00:00.000 | 71.12 | 68.62 | 55.52 | 52.69 | 71.12 | 68.62 | 55.52 | 52.69 | NULL | NULL | NULL | NULL |
| 2012-09-26 00:00:00.000 | 72.21 | 69.38 | 54.10 | 48.30 | NULL | NULL | NULL | NULL | 72.21 | 69.38 | 54.10 | 48.30 |
+-------------------------+----------------+----------------+--------------------+------------------+----------------+----------------+--------------------+------------------+----------------+----------------+--------------------+------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.