SQL:如何选择共享NAME字段的多个COUNT值?

问题描述 投票:3回答:1

我有一个名为STUDENTS的APACHE DERBY数据库表,其中包含以下行:

_____________________________
| NAME  |COUNTER|   MONTH   |
-----------------------------
| bill  |   10  |   January |
-----------------------------
| bill  |   12  |   February|
-----------------------------
| bill  |   11  |   March   |
-----------------------------
| sam   |   14  |   January |
-----------------------------
| sam   |   9   |   February|
-----------------------------
| sam   |   22  |   March   |
-----------------------------
| hal   |   21  |   January |
-----------------------------
| hal   |   18  |   February|
-----------------------------
| hal   |   19  |   March   |
-----------------------------

我试图找到语法来获得以下输出...

_________________________________
| NAME  |  JAN  |  FEB  |   MAR |
---------------------------------
| bill  |  10   |  12   |  11   |
---------------------------------
| sam   |  14   |   9   |  22   |
---------------------------------
| hal   |  21   |  18   |  19   |
---------------------------------

我尝试了以下方法:

select distinct(name), 
    (SELECT COUNTER FROM STUDENTS WHERE NAME = 'bill' AND month = 'january') as jan,
    (SELECT COUNTER FROM STUDENTS WHERE NAME = 'bill' AND month = 'february') as feb,
    (SELECT COUNTER FROM STUDENTS WHERE NAME = 'bill' AND month = 'march') as mar
    FROM STUDENT where name = 'bill'

......它可以作为一个学生的概念证明。但是,它是罗嗦的,它只适用于一个学生,并且它不会扩展我将添加到数据库的未来几个月的任何数据。意思是,我希望能够为每个NAME获取最后3个COUNTER值,而不管数据库中有多少个数据存在退出。

我看过多个s.o.与嵌套查询相关的问题,但没有一个有帮助。

建议?

任何帮助表示赞赏!

sql derby
1个回答
5
投票

您可以使用条件聚合

SELECT name,
       Max(CASE WHEN month = 'January'  THEN counter end) AS jan,
       Max(CASE WHEN month = 'February' THEN counter end) AS feb,
       Max(CASE WHEN month = 'March'    THEN counter end) AS mar
  FROM student
 GROUP BY name  
© www.soinside.com 2019 - 2024. All rights reserved.