1

この売上レポートを 1 回のクエリで計算することはできますか? 私は SQL にそれほど熱中しておらず、すべてを含む where 句を考慮して結合に頭を悩ませています。

TABLES (外部キーは 1-N と仮定):

TABLE contacts
id

TABLE reservations
id
created_at
contact_id

TABLE reservation_trips
id
reservation_id -- never null
amount
quantity
trip_type_id -- never null

TABLE cost_adjustments
id
reservation_trip_id -- never null
cost_type_id -- never null

TABLE trip_types
id
title

TABLE cost_types
id
title
kind

例:

reservations.created_at >= '2013-01-01T09:00:00+00:00' AND
reservations.created_at < '2014-01-01T09:00:00+00:00' AND
reservation_trips.trip_type_id in (1, 2, 3, 4) AND
cost_adjustments.trip_type_id in (5, 6, 7, 8) AND
contact_id in (9, 10, 11, 12)

結果列:

trip_types.title as trip_type_title,
COUNT(DISTINCT reservations.id) as bookings, -- distinct reservations
SUM(reservations.commissions) as commissions, -- distinct reservations
SUM(reservation_trips.id) as guests, -- distinct reservation_trips
SUM(reservation_trips.amount * reservation_trips.quantity) as gross_sales, -- distinct reservation_trips
SUM(cost_adjustments.amount * cost_adjustments.quantity) as adjustments, -- distinct cost_adjustments where cost_types.kind != 'tax'
SUM(gross_sales + adjustments - commissions) as net_sales

テーブルの列は次のようになります。

TRIP TYPE | BOOKINGS | GUESTS | GROSS SALES | ADJUSTMENTS | COMMISSIONS | NET SALES

ありがとう!

4

3 に答える 3

0

主な問題は、中間レベルを複数回カウントしないようにすることです。それを行う 1 つの方法は、各レベルの項目数で割ることです。

より効率的な別のアプローチは、各レベルを独自のサブクエリに入れ、それらをすべて結合することです。

これは、最初の方法でテストされていない刺し傷です。修正が必要かもしれませんIsNull(xxx, 0)

Select
    tt.title as trip_type_title,
    count(distinct r.id) as bookings,
    sum(r.commissions) / count(distinct r.id) as commissions,
    count(distinct rt.id) as guests, -- this seems odd, but it's in the example
    sum(rt.amount * rt.quantity) / count(distinct rt.id) as gross_sales,
    sum(ca.amount * ca.quantity) as adjustments,
    sum(rt.amount * rt.quantity) / count(distinct rt.id) + sum(r.commissions) / count(distinct r.id) + sum(ca.amount * ca.quantity) as net_sales
From
    trip_types tt
    inner Join reservation_trips rt on tt.id = rt.trip_type_id 
    inner Join reservations r on rt.reservation_id = r.id
    left outer join cost_adjustments ca on ca.reservation_trip_id = rt.id
    left outer join cost_types ct on ca.cost_type_id = ct.id
Where
    r.created_at >= '2013-01-01T09:00:00+00:00' and
    r.created_at < '2014-01-01T09:00:00+00:00' and
    rt.trip_type_id in (1, 2, 3, 4) and
    ca.trip_type_id in (5, 6, 7, 8) and
    contact_id in (9, 10, 11, 12) and
    ct.kind != 'tax'
Group By
    tt.title
于 2013-09-13T23:03:10.887 に答える
0

これを回してみてください。

SELECT trip_types.title as trip_type_title,
COUNT(DISTINCT reservations.id) as bookings,
SUM(reservations.commissions) as commissions,  distinct reservations,
SUM(reservation_trips.id) as guests,  distinct reservation_trips,
SUM(reservation_trips.amount * reservation_trips.quantity) as gross_sales, 
SUM(cost_adjustments.amount * cost_adjustments.quantity) as adjustments,  distinct cost_adjustments where cost_types.kind != 'tax'
SUM(gross_sales + adjustments - commissions) as net_sales
FROM trip_types tt
JOIN reservation_trips on tt.id = reservation_trips.trip_type_id 
JOIN reservations on reservation_trips.reservation_id = reservations.id
JOIN cost_adjustments ON cost_adjustments.reservation_trip_id = reservation_trips.id
WHERE 
reservations.created_at >= '2013-01-01T09:00:00+00:00' AND
reservations.created_at < '2014-01-01T09:00:00+00:00' AND
reservation_trips.trip_type_id in (1, 2, 3, 4) AND
cost_adjustments.trip_type_id in (5, 6, 7, 8) AND
contact_id in (9, 10, 11, 12)
GROUP BY trip_types.title
于 2013-09-13T22:22:12.963 に答える