クロス集計を使用してレポートに 2 つのクエリのユニオンがあります。レポートの目的は、各日付に対応する値をリストすることです。
最初のクエリは、日付に対応する値を返します。2 番目のクエリは、残りの日付とその値を返します。
最後に、両方のクエリの結合が行われます。多くの人が単一のクエリを使用してこれを達成することを提案するかもしれませんが、NULL 値を返さないため、LEFT JOIN を使用した単一のクエリではこれを行うことができませんでした。私がそれを機能させたとしても、私が持っているGROUP BY句はiReportの2つの行に分かれます.. NON NULLS AND NULLS.
したがって、これを行う唯一の方法は Union を使用することです。出力は次のようになります
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 .
結果の 2 つの行は、GROUP BY.(rowGroup) によるものです。Date は columnGroup です。理想的には、これを一列に並べたいと思います。
クエリは
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}
また、UNIONを必要としないように誰かが提案できますか。サブクエリを使用しても最適なパフォーマンスが得られないことはわかっています。しかし、JOINS の ON 句に WHERE 条件を使用しても役に立ちません。