2017-05-12 8 views
2

私は他の数とのパーセント差である3つの数値の表を持っています。SQL内の別のテーブルに列を追加する

は、私が使用したクエリは次のようになります。

次のように表の結果
select abs((((select avg(Number) from Table1 where File='File1') - 
    (select avg(Number) from Table1 where File='File2'))/
    (select avg(Number) from Table1 where File='File2'))*100) 
union all 
select abs((((select avg(Number) from Table1 where File='File3') - 
    (select avg(Number) from Table1 where File='File4'))/
    (select avg(Number) from Table1 where File='File4'))*100) 
union all 
select abs((((select avg(Number) from Table1 where File='File5') - 
    (select avg(Number) from Table1 where File='File6'))/
    (select avg(Number) from Table1 where File='File6'))*100) 

| (No column name) | 
|:----------------:| 
|    1.54 | 
|    1.15 | 
|    2.04 | 

これらの数字は、三つのファイルからのデータのカテゴリのパーセント差です。これらのファイル名はColumn1で、Table1です。代わりに、このような表のようにこのクエリを書くことができますか? (これらの数字の左側の列にファイル名を追加します)。

| FileName | (No column name) | 
|:--------:|:----------------:| 
| File1 |    1.54 | 
| File2 |    1.15 | 
| File3 |    2.04 | 
+1

各クエリに1列を追加し、column1でグループ化しますか? – scsimon

答えて

5

単にクエリにファイル名を追加します。

select FileName='File1', PCT_DIFF=abs((((select avg(Number) from Table1 where File='File1') - 
    (select avg(Number) from Table1 where File='File2'))/
    (select avg(Number) from Table1 where File='File2'))*100) 
union all 
select 'File3', abs((((select avg(Number) from Table1 where File='File3') - 
    (select avg(Number) from Table1 where File='File4'))/
    (select avg(Number) from Table1 where File='File4'))*100) 
union all 
select 'File5', abs((((select avg(Number) from Table1 where File='File5') - 
    (select avg(Number) from Table1 where File='File6'))/
    (select avg(Number) from Table1 where File='File6'))*100) 
+0

私はドルです。私は前にこれをやった。なぜ私はこれを考えなかったのか分かりません。私の脳を解き放ってくれてありがとう。 – Neal

2

は、クエリを簡素化!

select file, 
     100 * (prev_avg - avg)/avg as percent_diff 
from (select file, avg(Number) as avg, 
      lag(avg(Number)) over (order by file) as prev_avg 
     from table1 
     where file in ('File1', 'File2', 'File3', 'File4', 'File5', 'File6') 
     group by file 
    ) t 
where file in ('File2', 'File4', 'File6'); 

これは、ファイルが名前順に並べられていることを前提としています。もし何か他の方法で注文されたならば、簡単に修正するべきでしょう - 日付やサイズなど。

これは、追加の行にも容易に一般化されます。

関連する問題