Oracle XE Kwerenda (podział na dni, tygodnie, miesiace...)

0

Witam pragrammersów

Baza danych: Oracle XE q10

Mam tabele i dwie pozycje:

  • Data: (format 2010-01-01 1200)
  • Wartość

Zastanawiam jak stworzyć kwerendy, które by w wyniku od razu mi robiły podział na dni, tygodnie, miesiące... itd

Chodzi o to że mam w bazie rekordy z każdego dnia w roku i z każdej godziny i która posiada jakąs tam wartość. Np.

[ 2010-01-01 0000 | 300 ]
[ 2010-01-01 0000 | 600 ]
[ 2010-01-01 0000 | 800 ]
...

Później poprzez kwerendę sumuje sobie wartosci godzinne, dzienne lub miesieczne ...

0
select to_char(data, 'yyyy-mm-dd hh24'), sum(wartosc) from tabela group by to_char(data, 'yyyy-mm-dd hh24')

itd

0

Dzięki Misiek za pomoc. Myślałem nad tym ale nie wpadłem na to to_char :-D

Teraz pojawił się kolejny problem - z GROUP BY ....

Mam funkcje która tworzy dynamicznie kwerendy:

public PreparedStatement querryBarChartAndLineChart(String okres, String start, String end) throws SQLException
    {
       Connection con = databaseAccess.getOracleDbConnection();
       String sql = "SELECT to_char(data, ? ), SUM(wartosc) as suma FROM test WHERE data >= to_date( ? ,'YYYY-MM-DD HH24:MI') and data <= to_date( ? ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, ?) ORDER BY to_char(data, ?)";
       
       PreparedStatement prepState = con.prepareStatement(sql);
       prepState.setString(1, okres);
       prepState.setString(2, start);
       prepState.setString(3, end);
       prepState.setString(4, okres);
       prepState.setString(5, okres);

       return prepState;

Cały czas mam błąd ORA-000979 Not a aroup by expression

Dla testu zmieniełem kwerendę na:

SELECT to_char(data, ? ), SUM(wartosc) as suma FROM test WHERE data >= to_date( ? ,'YYYY-MM-DD HH24:MI') and data <= to_date( ? ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, 'YYYY-MM') ORDER BY to_char(data, 'YYYY-MM')";

... wybralem opcje miesiac aby zmienna okres miała wartość 'YYYY-MM' i dalej ten błąd.

Znowu zmieniełem kwerendę:

SELECT to_char(data, 'YYYY-MM' ), SUM(wartosc) as suma FROM test WHERE data >= to_date( ? ,'YYYY-MM-DD HH24:MI') and data <= to_date( ? ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, 'YYYY-MM') ORDER BY to_char(data, 'YYYY-MM')";

... i działa.

Od razu mówię że wartość zmiennej jest identyczna i jest ona Stringiem ( String okres = "YYYY-MM")

0

tutaj chyba jedynym wyjściem będzie zamiast parametrów po prostu składać zapytanie. Na 99% parametry 1, 4, 5 są traktowane przez bazę jako całkiem inne wartości. Ni masz możliwości użyć jednego parametru w kilku miejscach?

0
Misiekd napisał(a)

Ni masz możliwości użyć jednego parametru w kilku miejscach?

Cos nie moge zatrybić o co chodzi ... chyba przez te ze jest piątek :-D

Hmm... składanie zapytania mówisz.... no zrobiłem tak na początku ale nie pamiętam dlaczego od tego odszedłem. Myślałem ze na PreparedStatement będzie bardziej PRO :-D

Chyba ze Misiek masz inne rozwiązanie tego problemu. Mam 3 pola kombi na wybieram datę początku okresu, na drugim datę końca, trzecie pole kombi służy do wybierania jak będą grupowane dane (godzina , dzień ,miech itd). Jak ono działa ? Jak wybiorę dzień to zmienna String okres = 'YYYY-MM-DD', jak wybiorę miesiąc to okres = 'YYYY-MM', proste...

No i te dane wędrują do tej funkcji PreparedStatement którą wcześniej podesłałem. Tak to działa.

0
Juri napisał(a)
Misiekd napisał(a)

Ni masz możliwości użyć jednego parametru w kilku miejscach?

Cos nie moge zatrybić o co chodzi ... chyba przez te ze jest piątek :-D

W delphi mam coś takiego jak nazwane parametry, np

SELECT to_char(data, :okres), SUM(wartosc) as suma FROM test WHERE data >= to_date(:start ,'YYYY-MM-DD HH24:MI') and data <= to_date(:end ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, :okres) ORDER BY to_char(data, :okres)

i wtedy mam tylko jeden parametr 'okres'

Hmm... składanie zapytania mówisz.... no zrobiłem tak na początku ale nie pamiętam dlaczego od tego odszedłem. Myślałem ze na PreparedStatement będzie bardziej PRO :-D
bo tak powinno się to robić - przez parametry

Chyba ze Misiek masz inne rozwiązanie tego problemu. Mam 3 pola kombi na wybieram datę początku okresu, na drugim datę końca, trzecie pole kombi służy do wybierania jak będą grupowane dane (godzina , dzień ,miech itd). Jak ono działa ? Jak wybiorę dzień to zmienna String okres = 'YYYY-MM-DD', jak wybiorę miesiąc to okres = 'YYYY-MM', proste...

No i te dane wędrują do tej funkcji PreparedStatement którą wcześniej podesłałem. Tak to działa.

Możesz połączyć parametry ze składaniem sqla - przez parametr podajesz start i stop a wprost do stringa wklejasz okres, ale to już takie na wyrost będzie

1 użytkowników online, w tym zalogowanych: 0, gości: 1