Результат объединения 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} является сгенерированным именем меры на основе поля суммы.

Другие вопросы по тегам