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!
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
funktioniert "group by billdate" tatsächlich für Sie? – JamieD77
@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