7

私は次のmysqlデータベーステーブルを設計しています。

ticket(id, code, cust_name);
passenger(id, ticket_id, name, age, gender, fare);
service(id, passenger_id, item, cost);

チケットには多くの乗客が含まれ、各乗客は複数のサービスを購入できます。私が欲しいのは、各チケットの費用の総計を取得することです。

次のSQLを試しましたが、

SELECT 
    SUM(fare) as total_fare,
    (SELECT SUM(cost) as total_cost FROM services WHERE passenger.id = services.passenger_id) as total_service_cost
FROM
    ticket
JOIN passenger ON passenger.ticket_id = ticket.id

ただし、結果は total_fare として旅客運賃の合計を取得しますが、サービス費用については、最初の乗客の総サービス費用のみを合計して返します。

クエリをさらにネストする必要があると思います。助けが必要です。可能であれば、乗客運賃とサービス費用の合計の合計として結果を取得する方法を教えてください。

OK、ここで明確にするためにSQL挿入ステートメントがあります。


INSERT INTO `ticket` (`id`, `code`, `cust_name`) VALUES
(1, 'TK01', 'Dipendra Gurung');

INSERT INTO `passenger` (`id`, `ticket_id`, `name`, `age`, `gender`, `fare`) VALUES
(1, 1, 'John', '28', 'M', 120),
(2, 1, 'Kelly', '25', 'F', 120);

INSERT INTO `services` (`id`, `passenger_id`, `item`, `cost`) VALUES
(1, 1, 'S1', 30),
(2, 1, 'S2', 50),
(3, 2, 'S3', 50);

チケット 'TK01' の合計コスト (合計運賃とサービスの合計を含む) を取得したい。SQL は、合計運賃を 120+120 = 240、合計サービスを 30+50+50 = 130 として返す必要があります。

ありがとう!:)

4

6 に答える 6

3

3 つのテーブルを結合するだけで、副選択なしで直接 SUM を実行できます。GROUP BYチケットごとに必要な場合は、 ticket.id でグループ化するために使用する必要があります。

何かのようなもの:

SELECT t.id, SUM(p.fare) AS total_far, SUM(s.cost) AS total_cost
FROM 
    ticket t, passenger p, service s
WHERE t.id = p.ticket_id AND s.passenger_id = p.id 
GROUP BY t.id;
于 2013-08-13T06:10:58.333 に答える
2
SELECT 
    SUM(fare) as total_fare,
    SUM(cost) as total_service_cost
FROM
    ticket
left join passenger ON ticket.id = passenger.ticket_id
left join service ON passenger.id = service.passenger_id
于 2013-08-13T06:19:20.097 に答える
1

これはどう?

with fares as(
select p.id id, p.ticket_id ticket_id, sum(coalesce(s.cost,0)) cost
  from passenger p left outer join service s
       on p.id = s.passenger_id
 group by p.id, p.ticket_id)
select q.ticket_id, sum(f.cost), sum(q.fare), sum(f.cost + q.fare)
  from fares f inner join passenger q
       on f.id = q.id
 group by q.ticket_id;
于 2013-08-13T06:55:39.900 に答える
0

これはどうですか?

SELECT 
    SUM(fare) as total_fare,
    SUM(cost) as total_cost as total_service_cost
FROM
    ticket
JOIN passenger ON passenger.ticket_id = ticket.id
JOIN service ON passenger.id = service.passenger_id

各チケットを合計する必要がある場合は、追加しますGROUP BY ticket.id

于 2013-08-13T06:11:20.153 に答える
0
select
    t.code,
    sum(p.fare) as total_fare,
    sum(s.cost) as total_cost
from ticket as t
    inner join passenger as p on p.ticket_id = t.id
    inner join service as s on s.passenger_id = p.id
group by t.code
于 2013-08-13T06:15:40.770 に答える