2016-05-06 7 views
0

Ich habe Rechnungsdaten aus zwei Quellen. Ich möchte mich ihnen anschließen, um sehen zu können, wo es einen Datensatz in einem Satz gibt, der nicht in dem anderen ist und umgekehrt. Diese Abfrage tut, was ich will, aber ich fühle mich, als könnte es eleganter geschrieben werden? Ich möchte nur ein Feld für die Kontonummer und das Rechnungsdatum (M und Y) und dann Felder für die Gebühren in jeder Quelle trennen.Kann diese vollständige äußere Join-Abfrage vereinfacht werden?

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 

Alle Rückmeldungen wertschätzen!

+2

Sie sollten keine Funktionen in Suchkriterien, SQL Server verwenden können keine Indizes für diese verwenden. Verwenden Sie eine Datumsvariable mit dem Wert 20160201 und vergleichen Sie 'bill_date> = @billmonth und bill_date

+0

funktioniert "group by billdate" tatsächlich für Sie? – JamieD77

+0

@JamesZ - Danke, aktualisiert die Frage, eines der Daten hatte eine Zeit Teil, weshalb ich das da hatte, Gießen bis jetzt .. @ JamieD77 - Ja, es ist möglich, zwei Datensätze für den Monat in cst_bill – neuralgroove

Antwort

-1

ich so fühlen würden Sie ein genaueres Ergebnis geben ..

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 ohne Kommentare sind ungefähr so ​​nützlich wie Fußballschläger .. – JamieD77