2017-04-21 10 views
3

I持って表示されるデータを持つテーブルのように:私はそれには、以下の組み合わせを持つように配列を作成する必要があり、それぞれの日付の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 

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

上記の他の方法対ピボットの速度は何ですか? – Zanam

+0

テーブル/クラスタードインデックススキャン - >並べ替え(テーブルスキャンの場合) - >ストリーム集計(集計) - >計算スケーラー - >結果の選択など、すべての実行計画はほぼ同じです。 –

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

あなただけでそれを行うことができます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