2016-06-27 4 views
0

という患者のテーブルがあり、このテーブルには、の年齢がの患者がいるとします。私は誰が最も古いの患者、最も若いの患者であり、それらの平均年齢であるか知りたいです。だから、同じクエリで異なる集計関数の結果を結合するにはどうすればいいですか?

、テーブルがあるとします。

患者
名:テキスト
年齢:デシベル最古の患者である整数

  1. を?このため

私がやっている:私はすべての患者tahtを取得することができました

select name, age from patients 
where age = (select max(age) as 'HighestAges' from patients) 
group by name; 

この方法で(結果は同じ年齢とともに複数の患者の場合)は、より高い年齢層を持っています。

  1. 最も若い患者は誰ですか?

私がする必要があるのは、集計関数を変更するだけで、期待される結果が得られるでしょうか?だから私はやった:

select name, age from patients 
where age = (select min(age) as 'LowestAges' from patients) 
group by name; 

そして、私は最も年齢の低い患者を検索した。

  1. 全患者の平均年齢は?

私はちょうど平均年齢とより多くの何も選択します。私は、単一の結果セットにこれらの3つのクエリの結果を表示しますか:、今ここに大した

select avg(age) as 'AverageAge' from patients; 

をこれまでのところは良いです?

何私が達成したいことは、このように設定した結果である:

Name  HighestAges  Name  LowestAges  AverageAge 
Rosemary  62  Tomalino  22    42 
Mat   62  Rocat   22    42 

あなたは「愚かな結果がそれが何であるか?」考えるかもしれませんあなたは正しいです、それはそれが愚かであり、誰もこのようにしないので、それがそうであるように、それは私がそれをしたい理由です。何千もの方法があるかもしれないことを知っています。すべてのアイデアを聞きたい(読んでみたい)。私は楽しみのためにやっているだけです。私はSQLを学んでいますので、私はそれに満ちているわけではありません。私は、完全な結合、外部結合、内部結合、自己結合について多くのことを学びました。私は約2日間それらをすべて実行しようとしましたが、私は自分でそれを行うことができませんでしたので、私は助けを求めています。

ありがとうございます。

+0

に参加私は "mysqlの" タグを削除しました。 SQL ServerとT-SQLは基本的に同義語であり、MySQLではありません。 –

答えて

0

これはいくつかの方法で実行できます。これについて

select p.name, p.age, maxage, minage, avgage 
from patients p cross join 
    (select max(age) as maxage, min(age) as minage, avg(age) as avgage 
     from patients 
    ) pp 
where age in (maxage, minage); 
+0

ゴードンさんありがとう、助けてくれてありがとう。 – Marvin

+0

私にあなたに何かを聞かせてください、あなたはこの事がどのように働くのか教えてくれますか? – Marvin

0

方法:ここではあなたのクエリに基づいています一つの方法は、from句に=サブクエリを移動することで、ありますか?このソリューションは、「最も低い」というすべての組み合わせを返します。

--Sample table 
if object_id(N'tempdb..#patients') is not null drop table #patients; 
select [name] = N'name1', [age] = 35 
into #patients 
union all select N'name2', 28 
union all select N'name3', 29 
union all select N'name4', 28 
union all select N'name5', 28 
union all select N'name6', 29 
union all select N'name7', 31 
union all select N'name8', 35 
--select * from #patients 

;with cte as 
(
    select [name], [age] 
      ,[dr_min] = dense_rank() over(order by [age] asc) 
      ,[dr_max] = dense_rank() over(order by [age] desc) 
      ,[averageAge] = avg([age]) over() 
    from #patients 
) 
select c1.[name], [highestAge] = c1.[age], c2.[name], [lowestAge] = c2.[age], c1.[averageAge] 
from cte as c1 
join cte as c2 on c2.[dr_min] = c1.[dr_max] 
where c2.[dr_min] = 1 or c1.[dr_max] = 1 
order by c1.[name], c2.[name]; 
+0

それは素晴らしいですが、私はそれをかなり理解していません、それは私にとってはあまりにも進んでいます。しかし、私にこれらの概念を紹介してくれてありがとう。 – Marvin

0

一つの簡単な方法は、CTEを使用することで、クロス

;with cte1 as (
select * from patients where age = (
select min(age) from patients) 
), cte2 as (
select * from patients where age = (
select max(age) from patients) 
), cte3 as (
select avg(age) avgAge from patients) 
select c1.name, c1.age as MinAge, c2.name, c2.age as MaxAge, c3.avgAge from cte1 c1 cross join cte2 c2 
cross join cte3 c3 
関連する問題