3

私は次のテーブルを持っています

支払い

PayTypeId、説明

  • 0、クレジット
  • 1、借方
  • 2、マスター

ActualPayment Id、PayTypeId、Amount

  • 1,1,10

これが私が見ている出力です

Id、PayTypeId、Amount

  • 1,0、NULL
  • 1,1,10
  • 1,2、NULL

基本的に、すべての支払いタイプを含む、ActualPaymentのすべてのレコードが必要です。

これが私が使用したクエリですが、レコードを取得していません

select
*
from #ActualPayments ap 
left join #Payment p on ap.paytypeid = p.paytypeid 
where p.paytypeid is null
4

4 に答える 4

2

3つの値のそれぞれに1つのレコードPayTypeIDが必要な場合は、の左側にこれらの3つのレコードが必要ですLEFT JOIN

同様に、ActuallPaymentID各出力行にを必要とする場合、その値は左側にある必要があります。

それはすべて、あなたが持っているデータとあなたが説明したテーブルであなたを間違った道へと導きます。


あなたの質問にこれらの2つのテーブルだけがあるので、代わりにこのレイアウトを使用します...

SELECT
  ap.ActualPaymentID,
  p.PayTypeID,
  SUM(CASE WHEN ap.PayTypeID = p.PayTypeID THEN ap.Amount END)    AS Amount
FROM
  ActualPayments                    AS ap
CROSS JOIN
  Payment                           AS p
GROUP BY
  ap.ActualPaymentID,
  p.PayTypeID
于 2012-10-05T13:01:56.043 に答える
2

WHERE句ですべてを除外しているため、レコードを受信して​​いませんp.paytypeid is null

WHERE句なしで実行してみてください。

編集:以下のSQLは正しい情報を返すはずです。を使用しCROSS JOINてインラインビューを作成しました。これにより、不要なが削除されNULLます。

SELECT t1.id, t1.paytypeid, t2.amount
FROM (  
    SELECT id, payment.paytypeid 
    FROM #ActualPayments
    CROSS JOIN #Payment
) t1
LEFT OUTER JOIN #ActualPayments t2 
    ON t1.paytypeid = t2.paytypeid 
;
于 2012-10-05T13:00:45.500 に答える
0

私はあなたが完全な外部参加を望んでいると思います:

select
*
from #ActualPayments ap 
full outer join #Payment p
    on ap.paytypeid = p.paytypeid 
;

これにより、ActualPaymentsテーブルのすべての行が、Paymentの対応する値(存在する場合)とともに返されます。さらに、ActualPaymentsが存在しないPaymentからすべての行を返します。
注意:サンプルクエリのwhere句は使用しないでください。

于 2012-10-05T13:00:23.623 に答える
0

なぜあなたがこれをしたいのか私は混乱していますが、ここに1つの方法があります

select  ap.Id, pt.PayTypeId, ap2.Amount
from    #ActualPayments ap
    cross join #PaymentTypes pt
    left join #ActualPayments ap2
    on pt.PayTypeId = ap2.PayTypeId
    and ap.Id = ap2.id
于 2012-10-05T13:12:47.337 に答える