2016-05-06 7 views
0

私は2つのソースからの請求書データを持っています。 1組のレコードがどこにあるのか、もう一方のレコードにないレコードがあるかどうかを確認できるように、それらのレコードに参加したいと思います。このクエリは私が望むことをしますが、よりエレガントに書くことができるように感じますか?口座番号と請求書日付(MとY)のフィールドを1つだけ必要とし、各ソースの料金のフィールドを区切ります。この完全外部結合クエリを簡略化できますか?

DECLARE @BillDate datetime ='2/1/2016' 

SELECT ACCT_NO  = COALESCE(BPFACCT,CSTACCT)    , 
     BillDate = COALESCE(BPFBillDate,CSTBillDate)  , 
     BPFCharge            , 
     CSTCharge            , 
     Delta  = ROUND(COALESCE(BPFBill.BPFCharge,0)-COALESCE(CSTBill.CSTCharge,0),2) 
FROM 
(
    SELECT 
      BPFACCT  = acct_no        , 
      BPFBillDate = cast(billdate as date)    , 
      BPFCharge = SUM(charge) 
    FROM 
      cisbill b 
     JOIN 
      cisbilldetail bd ON b.billid=bd.billid 
    WHERE 
      billdate>[email protected] 
     AND 
      billdate<DATEADD(MONTH, 1, @BillDate) 
    GROUP BY 
      acct_no, billdate 
) BPFBill 
FULL OUTER JOIN 
(
    SELECT CSTACCT  = acct_no     , 
      CSTBillDate = cast(bill_date as date) ,    
      CSTCharge = SUM(new_charges) 
    FROM 
      cst_bill 
    WHERE 
      bill_date>[email protected] 
     AND 
      bill_date<DATEADD(MONTH, 1, @BillDate) 
    GROUP BY 
      acct_no, bill_date 

) CSTBill 
    ON  BPFBill.BPFACCT=CSTBill.CSTACCT 
     AND 
      BPFBill.BPFBillDate=CSTBill.CSTBillDate 

フィードバックをお寄せください。

+2

あなたは、SQL Serverが、そのためにインデックスを使用することはできません、検索条件の関数を使うべきではありません。値20160201の日付変数を使用し、 'bill_date> = @ビルモンとbill_date

+0

' group by billdate'は実際にここで働いていますか? – JamieD77

+0

@JamesZ - ありがとう、日付のうちの1つが時間の部分を持っていたので、私はそこにそれを今日持っていたのです。@ JamieD77 - はい、cst_billの月の2​​つのレコードを持つことが可能です – neuralgroove

答えて

-1
私はあなたがより正確な結果を与えるだろう。このように感じる

..

DECLARE @StartDate DATETIME = '2/1/2016', 
     @EndDate DATETIME 
SET  @EndDate = DATEADD(MONTH, 1, @BillDate) 

SELECT ACCT_NO, 
     MM, 
     YY, 
     BPFCharge = SUM(BPFCharge), 
     CSTCharge = SUM(CSTCharge) 
FROM 
(
    SELECT acct_no, 
      MM = MONTH(billdate), 
      YY = YEAR(billdate), 
      BPFCharge = charge 
      CSTCharge = 0.00 
    FROM cisbill b 
      JOIN cisbilldetail bd ON b.billid = bd.billid 
    WHERE billdate >= @StartDate 
      AND billdate < @EndDate 
    UNION ALL 
    SELECT acct_no, 
      MONTH(bill_date), 
      YEAR(Bill_date), 
      0.00, 
      new_charges 
    FROM cst_bill 
    WHERE bill_date >= @StartDate 
      AND bill_date < @EndDate 
) t 
GROUP BY ACCT_NO, 
     MM, 
     YY 
+1

コメントなしのdownvotesはサッカーのコウモリと同じくらい有用です。 – JamieD77

関連する問題