java - SQL 返回计数字段的总和。不允许我删除 GroupBy

标签 java postgresql count sum resultset

我有一点复杂的(对我来说)SQL 查询。
我需要计算每月 14:00:00 到 16:00:00 之间的所有记录,并且必须从字段内的时间戳中提取小时才能执行此操作。在应用到Java程序之前我一直在用PGAdmin3 Postgre练习SQL语句

   SELECT
    extract(hour from trips.tpep_pickup_datetime) AS hour,
    count(*)  AS aCount
FROM
    trips

where 

extract(hour from trips.tpep_pickup_datetime) >=14 and 

extract(hour from trips.tpep_pickup_datetime) <=16 and

month ='Jan'

group by
    1,extract(month from trips.tpep_pickup_datetime); 

这给我带来了查询中的一月结果..我只想要总和

    hour  |  aCount
-----------------------
     16   |  16111 
     14   |  13301
     15   |  14796

!!!更新!!!是的:我曾尝试删除该组,但收到错误消息

    ERROR:  column "trips.tpep_pickup_datetime" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2:     extract(hour from trips.tpep_pickup_datetime) as hour,
                              ^
********** Error **********

ERROR: column "trips.tpep_pickup_datetime" must appear in the GROUP BY clause or be used in an aggregate function
SQL state: 42803
Character: 31

我实际上需要返回的总和,而不是分割。 (44,208) 原因是我使用Java方法返回按月列出的给定时间之间的记录数。

[第 mnth 是月份名称的数组]

private void conRecTime(int time1, int time2) {
    String mnth;
    try {
        Statement stat1 = conn.createStatement();
        ResultSet rs1;
        for (int i = 0; i < monthsArr.length; i++) {
            mnth = monthsArr[i];

            rs1 = stat1.executeQuery(
                    "SELECT "
                    + "extract(hour FROM trips.tpep_pickup_datetime)AS hour,"
                    + "count(*) AS COUNT "
                    + "FROM trips "
                    + "WHERE "
                    + "extract(hour from trips.tpep_pickup_datetime) >="+ time1 
                    + "AND extract(hour from trips.tpep_pickup_datetime) <="+ time2
                    + "AND month ='"+ mnth + "'"
                    + "GROUP BY 1,extract(month from trips.tpep_pickup_datetime);");
            rs1.next();
            count = rs1.getInt(2);

            System.out.println("Count of records of " + mnth + " between the times " + time1 + " and " + time2 +  " is " + count + " records"  );
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

它只是读取每个月的第一行,即 16 小时(4 点),但我无法在 print 语句中使用该方法读取 14 或 15 小时。

我有点卡住了,因为我似乎对 SQL 语句执行的任何操作都会把它弄乱并且只是不喜欢它(我尝试了一些嵌套语句,但它只是时好时坏)。这是我第一次使用 SQL 和 Java,因此我们将不胜感激有关如何构建 Java 方法或 SQL 语句的建议

最佳答案

如果您不需要分割,只需放弃 group by 子句,并从 SELECT 列表中删除除计数之外的所有内容:

SELECT COUNT(*)  AS aCount
FROM   trips
WHERE  EXTRACT(HOUR FROM trips.tpep_pickup_datetime) >= 14 AND
       EXTRACT(HOUR FROM trips.tpep_pickup_datetime) <= 16 AND
       month = 'Jan'

关于java - SQL 返回计数字段的总和。不允许我删除 GroupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356982/

相关文章:

java - Selenium Grid (RemoteWebDriver) 与 Cucumber jvm SharedDriver 的使用

java - 动态单选按钮中的致命异常错误

postgresql - 从 pg_dump 中排除序列

java - 程序将返回出现的情况

java - MySQL 返回空结果

Java - 调用ArrayList中对象的方法

postgresql - 谷歌云计算, PostgreSQL

sql - 更新中间表

sql - 来自多个表的sql count()

mysql - 将 6 个项目加在一起得出总数,但不要将它们的值加在一起