Я пытаюсь express следующий SQL в JOOQ. Однако у меня либо возникают серьезные проблемы с типами, использующими производные таблицы, либо я получаю что-то, что компилируется, но либо выходит из строя на уровне SQL, либо даже в JAVA. Может кто-нибудь дать мне представление, как правильно использовать производные таблицы в этом контексте?
SELECT
id,
ROUND(num_realized / num_requirements, 2) AS realized_percent,
ROUND(num_requirements / max_req, 2) AS activity_percent
FROM (
SELECT
requirement.project_id AS id,
COUNT(requirement.id) AS num_requirements,
COUNT(requirement.realized) AS num_realized
FROM
requirement
GROUP BY
requirement.project_id) AS stats
CROSS JOIN (
SELECT
MAX(num_requirements) AS max_req
FROM (
SELECT
requirement.project_id AS id,
COUNT(requirement.id) AS num_requirements,
COUNT(requirement.realized) AS num_realized
FROM
requirement
GROUP BY
requirement.project_id) AS stats) AS req_max
Оператор отлично работает при применении в SQL, но я не могу получить это выражение в JOOQ.
Моя последняя попытка использовала
Table<Record3<Integer, Integer, Integer>> stats =
DSL.select(
REQUIREMENT.PROJECT_ID.as("id"),
DSL.count(REQUIREMENT.ID).as("num_requirements"),
DSL.count(REQUIREMENT.REALIZED).as("num_realized")
).from(REQUIREMENT).groupBy(REQUIREMENT.PROJECT_ID).asTable("stats");
Table<Record2<Integer, Integer>> req_max =
DSL.select(
stats.field(0),
DSL.min(stats.field(1))
)
.from(stats).asTable("req_max");
Однако я получаю сообщение об ошибке: несовместимые типы:
Table<Record2<CAP#1,CAP#2>> cannot be converted to Table<Record2<Integer,Integer>>
Я испробовал несколько различных техник, в том числе определение типа данных и использование .field (String, Datatype) вместо использования «Records», но все, что я м, он либо не компилируется, либо завершается с ошибкой при выполнении с неизвестной ошибкой.
Буду рад любой помощи.