2016-05-20 2 views
0

У меня есть немного сложный (мне) SQL-запрос.
Мне нужно засчитывать все записи между часами с 14:00 до 16:00:00 в месяц и для этого нужно извлечь час из метки времени в поле. Я практикую заявление SQL с pgadmin3 Postgre перед применением программы JavaSQL возвращает сумму поля count. Не разрешит мне удалить GroupBy

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); 

Это подводит меня Jan результаты в query..I просто хочу на сумму

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) Причина, заключающаяся в том, что im использует метод Java для возврата записей чисел между указанными временами, перечисленными по месяцам.

[мес представляет собой массив имен месяц]

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'oclock), но не может достигнуть часов 14 или 15 с этим методом в заявлении печати.

Я немного застрял, так как все, что я, похоже, выполняю в инструкции SQL, испортит его и просто не понравится (я пробовал несколько вложенных утверждений, и это просто было поражено и пропущено). Это первый раз, когда я работал с SQL и Java, поэтому совет по структурированию как метода Java, так и оператора SQL будет оценен

ответ

1

Если вам не положено сообщение, просто отмените предложение 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' 
+0

он не подведет меня, я попытался – Boo

+0

, если именно поэтому им получать проголосовали down..its действительно не очевидно – Boo

+0

ОШИБКА: ОШИБКА: колонка «trips.tpep_pickup_datetime» должен появиться в предложении GROUP BY или использоваться в агрегатной функции LINE 2: экстракт (час от trip.tpep_pickup_datetime) в час, ^ ********** Ошибка ********** ОШИБКА: столбец «trip.tpep_pickup_datetime» должен появиться в предложении GROUP BY или использоваться в агрегированной функции SQL state: 42803 Персонаж: 31 – Boo

Смежные вопросы