【问题标题】:Is it possible to make one SQL SELECT statement to one table and get back two columns with each their condition?是否可以对一张表创建一个 SQL SELECT 语句并取回两列,每个列都有它们的条件?
【发布时间】:2021-08-19 21:52:32
【问题描述】:

我有一个人表:

| id | name | age (18-20) | gender |
------------------------------------
| 1  | Kyle |      20     |   male |
| 2  | Jane |      19     | female |
| 3  | Brian|      19     |   male |
| 4  | Chris|      19     |   male |
| 5  | Mary |      19     | female |
| 6  | Kate |      20     | female |

我想创建一个 SELECT,在其中将每个性别放在各自的列中,并且行应显示年龄计数,如下所示:

| male | female |
-----------------
|   0  |    0   |
|   2  |    2   |
|   1  |    1   |

第一行显示有 2 名 18 岁的男性和 1 名女性。秒显示 19 等。我只是想了解逻辑,因此顺序(ASC、DESC)和类似的细节并不重要。

【问题讨论】:

  • 将年龄放入数据库有点愚蠢,您将不得不每年更改它。您应该存储 DOB 并计算它
  • @Charlieface 我完全同意。这只是我理解逻辑的一个例子,它不是我的实际表格。

标签: sql sql-server select


【解决方案1】:

简单的分组和条件聚合:

select age 
   , count(case when gender = 'male' then 1 end) male
   , count(case when gender = 'female' then 1 end) female
from  person
group by age

然后来自 cmets:

是否有可能总是让它返回所有 3 个年龄的结果。这意味着如果没有人 18 岁,它仍然应该返回所有 3 行 0

select ages.age 
   , count(case when gender = 'male' then 1 end) male
   , count(case when gender = 'female' then 1 end) female
from  (VALUES  (18) , (19) , (20)) ages(age)  
left join person p
  on ages.age = p.age
group by ages.age

【讨论】:

  • 好的,这可行,但是否可以始终让它返回所有 3 个年龄段的结果。这意味着如果没有人是 18 岁,它仍然应该返回所有 3 行,两列中都为“18 岁”计数?我已经编辑了帖子,所以你可以明白我的意思。
  • 非常感谢!!
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多