Um Daten über mehrere Tabellen hinweg abzufragen, möchten Sie den Tabellen beitreten
. Mir ist die Beziehung zwischen Ihren beiden Tabellen nicht 100 % klar, aber wenn MedicalRecordID
die richtige Beziehung ist, sollte Ihre Abfrage etwa so aussehen:
SELECT
CONVERT(char(80), i.InvDate,3) AS InvDate,
i.InvoiceNo,
i.EmployerCode,
i.TaxAmount + i.SubTotal AS Amount,
'' AS Payment,
pd.LastName,
pd.GivenName
FROM
dbo.Invoice i
INNER JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)
;
Dies funktioniert, wenn zwischen den Tabellen eine Eins-zu-eins-Beziehung besteht und immer ein PatientDetails
vorhanden ist Aufzeichnung für jede Rechnung. Wenn PatientDetails
optional ist, verwenden Sie dann LEFT JOIN
statt INNER JOIN
.
EDIT (Antwort auf Kommentar):
Ich wette, dass die DateTime-Konvertierung in Ihrer WHERE-Klausel nicht so funktioniert, wie Sie es erwarten. Angenommen, dass dtpFrom
und dtpTo
sind DatePicker
Steuerelemente, möchten Sie wahrscheinlich das SelectedDate
verwenden -Eigenschaft anstelle von Text
. Außerdem würde ich dringend empfehlen, in Ihren Abfragen Parameter zu verwenden, anstatt Zeichenfolgen zu verketten. Ihr Code wird sauberer und Sie vermeiden SQL-Injection
. Hier ist ein kurzes Beispiel:
using (SqlConnection connection = new SqlConnection( ... ))
{
connection.Open();
string sql = @"
SELECT
CONVERT(char(80), i.InvDate,3) AS InvDate,
i.InvoiceNo,
i.EmployerCode,
i.TaxAmount + i.SubTotal AS Amount,
'' AS Payment,
pd.GivenName
FROM
dbo.Invoice i
LEFT JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)
WHERE
InvDate >= @fromDate AND InvDate <= @toDate";
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.AddWithValue("@fromDate", dtpFrom.SelectedDate);
cmd.Parameters.AddWithValue("@toDate", dtpTo.SelectedDate);
using (SqlDataReader reader = cmd.ExecuteReader())
{
// do stuff with results
}
}