Ich habe 2 SQL Datenbank tabellen mit Umsatzinformationen. Hier Beispieldaten: # select \* from journal_accounting; id | amount | baseamount | currency | date | exchangerate | reference | type ----+------------+------------+----------+------------+--------------+---------------------------------------------------------------------------+------------------ 27 | 2202.0000 | | EUR | 2025-02-12 | | c530a7aa-52c5-4dcf-be62-fd8946c4050b | Rechnungsausgang 28 | 13445.2800 | | EUR | 2025-02-17 | | 5c8fa50b-22fc-4f3f-b302-bb46842bb69e | Rechnungsausgang 29 | 3080.0000 | | EUR | 2025-03-06 | | c0e966a5-5a0d-45a7-9413-eeffadd0ea27 | Rechnungsausgang 30 | 20730.0000 | | EUR | 2025-02-17 | | c554aacd-b096-4102-aebf-a0cf5023d159 | Rechnungsausgang 31 | 370.0000 | | EUR | 2025-03-04 | | 69666156-dd0f-40cc-9f84-543c69e3a534 | Rechnungsausgang 32 | 1957.6800 | | EUR | 2025-03-10 | | 8522399b-e953-47e9-b18e-f9cfbc6565b0 | Rechnungsausgang 33 | 225.0000 | 220.7400 | USD | 2025-03-07 | 1.019307 | 0528bc9f-b0d9-4079-a89a-af2c978f141d | Rechnungsausgang 38 | 2806.9600 | | EUR | 2025-02-18 | | 9d0929a9-1790-4001-bce1-fb376a8032aa | Rechnungsausgang # select \* from journal_accounting_attribute; id | key | value | journalaccounting_id -----+-------------+------------------------------------------+---------------------- 1 | space.name | | 1 2 | dbtr.name | SHANGHAI AS. DEV. PROSP. INT LOG. Co.Ltd | 1 3 | dbtr.number | D18516 | 1 4 | dbtr.name | SHANGHAI AS. DEV. PROSP. INT LOG. Co.Ltd | 2 5 | space.name | | 2 6 | dbtr.number | D18516 | 2 7 | dbtr.number | D16571 | 3 8 | space.name | | 3 9 | dbtr.name | Bixwood AB | 3 Wie würdest Du ein Select Statement erstellen, das alle Umsätze pro Firma pro Währung nach Datum aufschlüsselt? # Umsätze Nach Firma SELECT ja.date, ja.currency, jaa.value AS "Firma", COALESCE(jab.value, '') AS "Firmennummer", SUM(ja.amount) AS "Gesamtbetrag" FROM journal_accounting ja LEFT JOIN journal_accounting_attribute jaa ON ja.id = jaa.journalaccounting_id AND jaa.key = 'dbtr.name' LEFT JOIN journal_accounting_attribute jab ON ja.id = jab.journalaccounting_id AND jab.key = 'dbtr.number' WHERE jaa.key IN ('dbtr.name', 'dbtr.number') GROUP BY ja.date, ja.currency, jaa.value, jab.value ORDER BY ja.date, ja.currency, jaa.value; # Umsätze nach Firma und Monat SELECT DATE_TRUNC('month', ja.date) AS "Monat", ja.currency, jaa.value AS "Firma", SUM(ja.amount) AS "Gesamtbetrag" FROM journal_accounting ja LEFT JOIN journal_accounting_attribute jaa ON ja.id = jaa.journalaccounting_id AND jaa.key = 'dbtr.name' WHERE jaa.key IN ('dbtr.name') GROUP BY "Monat", ja.currency, jaa.value ORDER BY "Monat", ja.currency, jaa.value; # Nur nach Monat SELECT DATE_TRUNC('month', ja.date) AS "Monat", SUM(ja.amount) AS "Gesamtbetrag" FROM journal_accounting ja WHERE ja.type = 'Rechnungsausgang' GROUP BY "Monat" ORDER BY "Monat"; Monat | Gesamtbetrag ------------------------+-------------- 2025-02-01 00:00:00+00 | 39184.2400 2025-03-01 00:00:00+00 | 5407.6800 # Java Impl ```java import org.imixs.workflow.office.journal.JournalAccounting; import org.imixs.workflow.office.journal.JournalAccounting_; import org.imixs.workflow.office.journal.QJournalAccounting; import java.time.LocalDate; import java.util.List; import jakarta.persistence.EntityManager; import jakarta.persistence.TemporalType; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; public class JournalAccountingRepository { private final EntityManager entityManager; public JournalAccountingRepository(EntityManager entityManager) { this.entityManager = entityManager; } public List findByMonth() { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Object[].class); Root root = cq.from(JournalAccounting.class); // Define the projection cq.multiselect( cb.function("DATE_TRUNC", LocalDate.class, root.get(JournalAccounting_.date), cb.literal("MONTH")), cb.sum(root.get(JournalAccounting_.amount)) ); // Define the where clause Predicate predicate = cb.equal(root.get(JournalAccounting_.type), "Rechnungsausgang"); cq.where(predicate); // Define the group by clause cq.groupBy(root.get(JournalAccounting_.date).as(LocalDate.class)); // Order by month cq.orderBy(cb.asc(root.get(JournalAccounting_.date).as(LocalDate.class))); TypedQuery query = entityManager.createQuery(cq); return query.getResultList(); } } ```