office-alexander-logistics/IMIXS_JOURNAL.md
2025-03-27 20:58:16 +01:00

4.7 KiB

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

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<Object[]> findByMonth() {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);
        Root<JournalAccounting> 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<Object[]> query = entityManager.createQuery(cq);
        return query.getResultList();
    }
}