2016-06-27 98 views
0

假設我有一張名爲的患者患者,在此表中有年齡段。我想知道誰是最早的患者,最小的患者和其中的平均年齡。如何在同一個查詢中加入不同聚合函數的結果?

因此,考慮到表:

患者
名稱:文本
年齡:整數

  1. 誰是最古老的患者在分貝?

對於這個我做:

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

這樣我就能夠獲取每個病人taht具有較高的年齡(如果是一個以上的患者與結果相同的年齡) 。

  1. 誰是最年輕的患者?

那麼,我需要做的只是改變聚合函數,我會得到預期的結果,對吧?所以我做了:

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

我找回了所有年齡最小的病人。

  1. 所有患者的平均年齡是多少?

我只是選擇了平均年齡僅此而已:

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

到目前爲止好,現在,這裏的大問題:我怎麼證明這3個查詢的結果在一個單一的結果集?

我想要實現的是設置這樣的結果:

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

你可能會想「一個愚蠢的結果是什麼呢?」你是對的,它看起來很愚蠢,這就是爲什麼我想這樣做,因爲它很愚蠢,沒有人會這樣做。我知道可能有成千上萬的做法,我想聽到(讀)所有的想法。我只是爲了好玩而努力,我正在學習SQL,所以我沒有經歷過這個過程。我學到了很多關於完整連接,外部連接,內部連接和自我連接的知識,我已經嘗試了大約兩天完成它們,但我無法自己完成,因此我正在尋求幫助。

預先感謝您。

+0

我去掉了 「MySQL的」 標籤。 SQL Server和T-SQL基本上是同義詞,它們不是MySQL。 –

回答

0

您可以通過多種方式來完成此操作。下面是建立在你的查詢,由=子查詢移動到from第一種方法:

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

Uhnn讓我問你一些事情,你能告訴我這些東西是如何工作的嗎? – Marvin

0

這個怎麼樣?該解決方案返回「最高最低」的所有組合。

--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 
相關問題