2016-09-22 15 views
2

私は注文テーブルと支払い情報を含む旅行テーブルを持っています。これは多対多の関係です。注文は多くの旅行に分かれ、1回の旅行では2つの注文と注文の支払い情報を得ることができます。 Tripsテーブルには「ゼロ」レコードはありません。その値をキーとして左結合するとNULLレコードが返されます。グループバイナリで左外部結合、除外ヌル

select o.order_id, 
    t.trip_nbr,  
    sum(t.payment_amt) 
from orders o 
left outer join trips t 
    on o.trip_nbr = t.trip_nbr 
group by o.order_id, 
    t.trip_nbr 

結果::

+----+----------+--------------+ 
| order_id | trip_nbr | sum  | 
+----+----------+--------------+ 
| 1  | 12  | 20.00 | 
| 2  | 22  | 135.50 | 
| 2  | NULL  | NULL | 
| 4  | 25  | 133.33 | 
| 7  | NULL  | NULL | 
+----+----------+--------------+ 

問題がある、私が注文テーブルとちょうど支払いからの情報の多くを得る私はここで

Order table 
+----+----------+--------------+ 
| order_id | trip_nbr | veh_id | 
+----+----------+--------------+ 
| 1  | 12  | 3 | 
| 2  | 22  | 6 | 
| 2  | 0  | 8 | 
| 4  | 25  | 7 | 
| 7  | 0  | 11 | 
+----+----------+--------------+ 

Trips table 
+----+------------+--------------+ 
| trip_nbr | payment  | veh_id | 
+----+------------+--------------+ 
| 12  | 20.00  | 3 | 
| 22  | 123.00  | 6 | 
| 22  | 12.50  | 6 | 
| 25  | 133.33  | 7 | 
+----+------------+--------------+ 

は私のクエリでSQL 2012を使用しています情報をTripsテーブルから削除します。だから私は任意の注文レコードを除外したくないです( "WHERE t.trip_nbr is not"という句を追加すると起こります)。しかし私はグループ化に2つのレコードを取得したくありません - t.trip_nbr NULLであり、一致するものが見つかる場所です。

望ましい結果:

+----+----------+--------------+ 
| order_id | trip_nbr | sum  | 
+----+----------+--------------+ 
| 1  | 12  | 20.00 | 
| 2  | 22  | 135.50 | 
| 4  | 25  | 133.33 | 
| 7  | NULL  | NULL | 
+----+----------+--------------+ 

私は、比類のない記録ORDER_ID = 2は「離れ要約」することにしたい - しかし、その理由は、この表には、後で別に加入していることであるORDER_ID = 7のための唯一の記録を保持余分なNULLレコードが重複を作成しています。

+0

なしがありますしかし、 'trips'テーブルの' order_id' – Lamak

+0

oops- trip_nbrで結合するように固定 – tember

+0

どうすれば多対多の関係になりますか? 'order'テーブルは' trip'テーブルに外部キーを持ちますか?多対多の関係は、結合表を必要とし、参加しているエンティティー表の外部キーを必要とせず、またはそれから利益を得ません。 –

答えて

1

これは動作するはずです:

WITH orders2 AS 
(
    SELECT *, 
      N = SUM(CASE WHEN trip_nbr <> 0 THEN 1 ELSE 0 END) OVER(PARTITION BY order_id) 
    FROM orders 
) 
SELECT o.order_id, 
     t.trip_nbr, 
     SUM(t.payment_amt) 
FROM orders2 o 
LEFT OUTER JOIN trips t 
    ON o.trip_nbr = t.trip_nbr 
WHERE N = 0 OR (N > 1 AND o.trp_nbr <> 0) 
GROUP BY o.order_id, 
     t.trip_nbr; 
-1

nullをゼロに変換すると、指定されたorder_idに "trip_nbr"と "sum"を合計します。これはあなたの挑戦を解決しないでしょうか?

create table #Order (Order_Id int , Trip_nbr int , Veh_id int) 

Create Table #Trips (trip_nbr int , Payment Numeric(13,2), Veh_id int) 


insert into #Order (Order_id, Trip_nbr, Veh_id) values (1,12,3) 
insert into #Order (Order_id, Trip_nbr, Veh_id) values (2,22,6) 
insert into #Order (Order_id, Trip_nbr, Veh_id) values (2,0 ,8) 
insert into #Order (Order_id, Trip_nbr, Veh_id) values (4,25,7) 
insert into #Order (Order_id, Trip_nbr, Veh_id) values (7,0,11) 

insert into #Trips (trip_nbr, Payment, Veh_id) values (12, 20.00 , 3) 
insert into #Trips (trip_nbr, Payment, Veh_id) values (22, 123.00,6) 
insert into #Trips (trip_nbr, Payment, Veh_id) values (22, 12.50 , 6) 
insert into #Trips (trip_nbr, Payment, Veh_id) values (25, 133.33 , 7) 

select Order_id, trip_nbr = sum(trip_nbr), Payment = sum(payment) 
from 
(
select o.order_id, 
     t.trip_nbr,  
    Payment = sum(t.Payment) 
from #order o 
     left outer join #trips t on t.trip_nbr = o.trip_nbr 
     -- left outer join #order o on t.trip_nbr = o.trip_nbr 
group by o.order_id,  t.trip_nbr 
) x 
group by Order_id 
order by Order_id 
+0

no - trip_nbrはnullであるため、外部結合のレコードの1つとしてnullレコードが返されます。これは、問題の出発点としてこの例で使用したクエリとほぼ同じですか?あるいは、少なくとも私はそれがどう違うのか分かりません。 – tember

1

をあなたはNULL余分識別するためにRANKのようなウィンドウ関数を使用することができます - 大切なレコードをし、外側のクエリでそれらをフィルタリング:

select order_id, 
     trip_nbr,  
     total_payment 
from (
    select o.order_id, 
     t.trip_nbr,  
     sum(t.payment) as total_payment, 
     rank() over (partition by order_id 
         order by case 
            when t.trip_nbr IS NULL then 2 
            else 1 
           end) as rnk 
    from orders o 
    left outer join trips t 
     on o.trip_nbr = t.trip_nbr 
    group by o.order_id, t.trip_nbr) as t 
where t.rnk = 1 
関連する問題