1

クロス集計を使用してレポートに 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 条件を使用しても役に立ちません。

4

2 に答える 2

1

クエリに 0.00 の値を追加する代わりに、クロス集計の詳細フィールドに値を追加して、詳細/詳細セクションのフィールドのフィールド式を変更することもできます。

$V{amountMeasure} == null ? 0.00 : $V{amountMeasure}

$V{amountMeasure}これは、金額フィールドに基づいてメジャーの生成された名前であると想定しています。

于 2013-01-09T11:41:41.987 に答える
0
 SELECT DATE, SUM(AMOUNT)
 FROM (first query UNION second query)
 GROUP BY DATE
 ORDER BY DATE
于 2013-01-08T19:58:43.140 に答える