2017-05-13 8 views
1

私は以下のようなテーブルを持っています。私は、test1とtest2の列平均を表示するSQL文と、mainの列と、positionの列を記述します。私はこのSQL試したenter image description here特定の行の値の平均のSQL文グループの列

enter image description here

+0

はここに位置何ですか? –

+0

私は 'AVG(( 'test1'、 'test2'))'の検査で大文字と小文字が区別されるケースと考えます –

+0

希望する結果を入力してください。これらの意味は明らかではありません。 –

答えて

0

あなたが好きな何かができる:

select name, average as final,AVG(case when exam in('test1','test2')) as testa 
from table 
where exam='main' 
order by main final 
group by name; 

しかし、それは働いていませんが....私は結果は次のように表示させたい 助けてください以下。

Select t1.name, average12, main, rownum from (
    select t1.name as name, t1.avg(average) as average12, t2.mainexam as main 
    from <table> t1 left join <table> t2 
    on t1.id = t2.id 
    where t2.exam = 'Main' 
    group by t1.name, t2.mainexam 
) order by main desc; 
0

SQL Serverのこのクエリをお試しください:

SELECT 
     e.name AS 'Student Name' 
    , CAST(AVG(CASE WHEN e.Exam IN ('Test1', 'Test2') THEN e.average END) AS FLOAT) AS 'Test Average' 
    , e2.average AS 'Main Exam' 
    , ROW_NUMBER() OVER (ORDER BY e2.average DESC) AS 'Position' 

FROM 
    exams AS e 

    INNER JOIN exams AS e2 
     ON e2.name = e.name 
     AND e2.exam = 'Main' 

GROUP BY 
     e.name 
    , e2.average 

ORDER BY 
    e2.average DESC 

出力は次のとおりです。

+--------------+--------------+-----------+----------+ 
| Student Name | Test Average | Main Exam | Position | 
+--------------+--------------+-----------+----------+ 
| Name1  |   60.5 |  89 |  1 | 
| Name2  |   49.5 |  63 |  2 | 
| Name3  |   73 |  38 |  3 | 
+--------------+--------------+-----------+----------+ 
+0

ありがとうたくさん...今それは動作します – kymb

+0

あなたは大歓迎です!あなたが問題を解決したと思ったら答えを受け入れてください:) – xcvd

0

この単純なクエリの平均値のTest1とTest2を。あなたのdbmsに応じて、の名前のような予約語に問題があるかもしれません。

select name, cast(avg(average) as integer) 
from test 
where exam = 'Test1' 
    or exam = 'Test2' 
group by name; 

この簡単なクエリでは、「main」という値が得られます。

共通のテーブル式にまとめて「名前」を結合します。

with test_avg as (
    select name, cast(avg(average) as integer) 
    from test 
    where exam = 'Test1' 
    or exam = 'Test2' 
group by name 
), main_avg as (
    select name, average as main 
    from test 
    where exam = 'Main' 
) 
select t1.name, t1.avg, t2.main 
from test_avg t1 
inner join main_avg t2 
on t1.name = t2.name; 
 
name  avg main 
-- 
Name1  61 89 
Name2  50 63 
Name3  73 38 

私はあなたが位置によって何を意味するのか分かりません。行の順位を高い平均から最低の平均にする場合は、このようにすることもできます。

with test_avg as (
    select name, cast(avg(average) as integer) 
    from test 
    where exam = 'Test1' 
    or exam = 'Test2' 
group by name 
), main_avg as (
    select name, average as main 
    from test 
    where exam = 'Main' 
) 
select t1.name, t1.avg, t2.main, row_number() over (order by avg desc) as position 
from test_avg t1 
inner join main_avg t2 
on t1.name = t2.name 
order by position; 
 
name  avg main position 
-- 
Name3  73 38 1 
Name1  61 89 2 
Name2  50 63 3 
0

あなたがここに最大で遊ぶことができます....その非常にシンプル

select a.*,row_number() over (order by main desc) as position from 
(
    select name, 
    AVG(case when exam in ('Test1','Test2') then Average else null end) as testa, 
    max(case when exam in ('Main') then Average else null end) as main 
    from abc 
    group by name 
) a 
    order by name; 

出力:

name testa main position1 
Name1 60.50 89  1 
Name2 49.50 63  2 
Name3 73.00 38  3 
+0

@kymb:それはうまくいったのですか? –