2017-04-21 73 views
3

我有具有顯示數據的表爲:SQL替代內加入

Staion Date  Temperature 
A  2015-07-31 8 
B  2015-07-31 6 
C  2015-07-31 8 
A  2003-02-21 4 
B  2003-02-21 7 
C  2003-02-21 7 

對於每個I需要創建陣列從而使得它具有以下組合日期:

c1 = (A + B)/2, c2 = (A + B + C)/3 and c3 = (B + C)/2 

右我在桌子上做了三個不同的inner join,並做了最後的inner join以達到以下效果:

Date   c1 c2  c3 
2015-07-31 7  7.33 7 
2003-02-21 5.5 6  7 

有沒有更乾淨的方法來做到這一點?

回答

1

您可以使用支點和計算上的擺動數據如下:

select [Date], c1 = (A+B)/2.0, c2 = (A+B+C)/3.0, C3 = (B+C)/2.0 from 
(select * from #yourstation) s 
pivot (max(temparature) for station in ([A], [B], [C])) p 

您的輸入表:

create table #yourStation (station char(1), date date, Temparature int) 

insert into #yourStation (station, date, Temparature) values 
('A','2015-07-31', 8 ) 
,('B','2015-07-31', 6 ) 
,('C','2015-07-31', 8 ) 
,('A','2003-02-21', 4 ) 
,('B','2003-02-21', 7 ) 
,('C','2003-02-21', 7 ) 
+0

什麼是樞紐VS以上等方法的速度? – Zanam

+0

幾乎所有的執行計劃都是一樣的,它使用Table/Clustered Index Scan - > Sort(如果它是表掃描) - > Stream Aggregate(Aggregate) - > Compute Scalar - > select results ... –

6

無需爲JOIN,你可以簡單地用一個GROUP BY和聚合函數:

WITH CTE AS 
(
    SELECT [Date], 
      MIN(CASE WHEN Staion = 'A' THEN Temperature END) A, 
      MIN(CASE WHEN Staion = 'B' THEN Temperature END) B, 
      MIN(CASE WHEN Staion = 'C' THEN Temperature END) C 
    FROM dbo.YourTable 
    GROUP BY [date] 
) 
SELECT [Date], 
     (A+B)/2 c1, 
     (A+B+C)/3 c2, 
     (B+C)/2 c3 
FROM CTE; 
3

SUM功能是在這種情況下非常有用:

SELECT 
    c1 = SUM(CASE WHEN Staion IN ('A', 'B') THEN Temperature ELSE 0 END)/2, 
    c2 = SUM(Temperature)/3, 
    c3 = SUM(CASE WHEN Staion IN ('B', 'C') THEN Temperature ELSE 0 END)/2, 
    [Date] 
FROM dbo.Table 
GROUP BY [Date] 
2

你可以做它兩個連接和幾乎字面上你提供的公式:

declare @t table (Station char(1) not null,[Date] date not null, Temperature int not null) 
insert into @t(Station,[Date],Temperature) values 
('A','20150731',8), 
('B','20150731',6), 
('C','20150731',8), 
('A','20030221',4), 
('B','20030221',7), 
('C','20030221',7) 

select 
    B.[Date], 
    c1 = (A.Temperature + B.Temperature)/2.0, 
    c2 = (A.Temperature + B.Temperature + C.Temperature)/3.0, 
    c3 = (B.Temperature + C.Temperature)/2.0 
from 
    @t B 
     inner join 
    @t A 
     on 
      B.[Date] = A.[Date] 
     inner join 
    @t C 
     on 
      B.[Date] = C.[Date] 
where 
    A.Station = 'A' and 
    B.Station = 'B' and 
    C.Station = 'C' 

結果:

Date  c1    c2   c3 
---------- --------------- ----------- ---------- 
2015-07-31 7.000000  7.333333 7.000000 
2003-02-21 5.500000  6.000000 7.000000