【问题标题】:Count different column based on values in PostgreSQL根据 PostgreSQL 中的值计算不同的列
【发布时间】:2019-11-27 21:37:10
【问题描述】:

我有下面的学生表,其中包含每个学生的分数范围。 每个学生可以有多个科目的分数范围,但不一定是所有科目。

Id | Maths | Science | History | Economics
 1 | 25-50 |         |         |          
 2 |       |  50-75  |         |          
 3 |       |         |  0-25   |          
 1 |       |         |         |  > 90  
 4 |       |         |         |          
 2 |       |         |  50-75  |          
 4 |       |  50-75  |         |          
 1 |75-100 |         |         |          
 3 |       |         |         |  30-60 
 1 |       |  50-75  |         |          

数学、科学、历史的范围是[0-25, 25-50, 50-75, 75-100] 经济学是[0-30, 30-60, 60-90, >90]

我需要一个查询,它将返回每个主题的 4 列和所有范围值以及不同 ID 的计数

Subject  | Range | count
Maths    | 0-25  |   1  
Maths    | 25-50 |   0 
Maths    | 50-75 |   0  
Maths    |75-100 |   1  
Science  | 0-25  |   0  
Science  | 25-50 |   0 
Science  | 50-75 |   3  
Science  |75-100 |   0 
History  | 0-25  |   1  
History  | 25-50 |   0 
History  | 50-75 |   1  
History  |75-100 |   0 
Economics| 0-30  |   0
Economics| 30-60 |   1
Economics| 60-90 |   0
Economics|  > 90 |   1

请帮忙

【问题讨论】:

    标签: postgresql conditional-statements


    【解决方案1】:

    您需要取消透视数据:

    select x.subject, x.range, count(distinct t.id)
    from the_table
      cross join lateral ( 
        values 
           (maths, 'Maths'), (science, 'Science'), (history, 'History'), (economics, 'Economics')
      ) as x(range, subject)
    where range is not null
    group by x.subject, x.range;
    

    values 子句为基表的每一列生成一行。结果有两列名为rangesubject

    【讨论】:

    • 得到这个错误:在表“student”中有一个名为“maths”的列,但是不能从这部分查询中引用它。
    猜你喜欢
    • 2020-08-23
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多