Результат объединения JasperReports в один ряд
У меня есть объединение двух запросов в отчете с использованием кросс-таблицы. Цель отчетов - перечислить значения, соответствующие каждой дате.
1-й запрос возвращает значения, соответствующие дате. 2nd Query возвращает оставшиеся даты и их значения.
Наконец, объединение обоих запросов сделано. Многие люди могут предложить достичь этого с помощью одного запроса, но мне не удалось сделать это с помощью одного запроса с использованием LEFT JOIN, поскольку он не возвращает значения NULL. Даже если мне это удастся, предложенное мной предложение GROUP BY будет разделено на две строки в iReport. NON NULLS AND NULLS.
Таким образом, единственный способ, которым я могу думать об этом, - использовать Союз. Выход выглядит как
01/01/2013 02/01/2013 03/01/2013 04/01/2013 05/01/2013
X £120.00 £120.00 £120.00
£0.00 £0.00 .
Результирующие две строки из-за GROUP BY.(RowGroup). Дата является столбцом группы. В идеале я бы хотел, чтобы это было в один ряд.
Запрос
SELECT
rates_Booking.date
rates_Booking.amount,
booking.reference
FROM
rates_Booking
LEFT JOIN booking ON booking.reference = rates_Booking.bookingReference
LEFT JOIN unit ON booking.apartment = unit.unit
LEFT JOIN property ON property.property = unit.property
WHERE
rates_Booking.date BETWEEN $P{startDate} AND $P{endDate}
AND $X{IN,property.property,buildings}
AND $X{IN,property.area,location}
AND $X{IN, unit.unit, unit}
UNION
SELECT
rates_Calendar.date
0.00 as amount,
'' as reference
FROM
rates_Calendar,unit
LEFT JOIN property ON property.property = unit.property
LEFT JOIN regions ON regions.region = property.area
# unit to apartments
LEFT JOIN apartments ON (apartments.unit = unit.unit)
LEFT JOIN apartmentTypes ON (apartmentTypes.id = apartments.apartmentTypeId)
WHERE
rates_Calendar.date BETWEEN $P{startDate} AND $P{endDate}
AND rates_Calendar.date NOT IN (
SELECT
rates_Booking.date
FROM
rates_Booking
LEFT JOIN booking ON booking.reference = rates_Booking.bookingReference
LEFT JOIN unit ON booking.apartment = unit.unit
LEFT JOIN property ON property.property = unit.property
LEFT JOIN apartments ON (apartments.unit = unit.unit)
LEFT JOIN apartmentTypes ON (apartmentTypes.id = apartments.apartmentTypeId)
WHERE
rates_Booking.date BETWEEN $P{startDate} AND $P{endDate}
AND $X{IN, unit.unit, unit}
AND $X{IN, apartmentTypes.id,apartmentType}
GROUP BY
rates_Booking.date
)
AND $X{IN,property.property,buildings}
AND $X{IN,property.area,location}
AND $X{IN, unit.unit, unit}
Также может кто-то подсказать, чтобы для этого не нужен СОЮЗ. Я знаю, что использование подзапроса не приведет к оптимальной производительности. Но наличие условий WHERE в предложениях ON в JOINS не помогает.
2 ответа
SELECT DATE, SUM(AMOUNT)
FROM (first query UNION second query)
GROUP BY DATE
ORDER BY DATE
Вместо добавления значений 0,00 в запросе вы также можете добавить их в поле сведений кросс-таблицы, изменив выражение поля для поля в разделе "Детали / Детали":
$V{amountMeasure} == null ? 0.00 : $V{amountMeasure}
при условии, что $V{amountMeasure}
является сгенерированным именем меры на основе поля суммы.