2012-10-08 40 views
0
合併數據

聲明:這是一個測試/ DUMMY/FAKE DATABASE從2個表

球員嗨,我有一個問題,以下是2層的表結構。當我使用

SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM dbo.Invoice; 

http://i48.tinypic.com/icpzpy.png

我希望在一列患者添加名稱由地方將被標記,以發票號碼。所以我的意思是說,當查詢被執行時,它應該顯示與發票號碼一起標記的患者詳細信息。但在這兩種表格結構中都沒有鏈接。我能想到的唯一連接「MedicalRecordID」。我試過使用UNION功能didnt給我所需的輸出。任何幫助?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 


namespace MedicalDataExporter 
{ 
public partial class frmSales : Form 
{ 
    public frmSales() 
    { 
     InitializeComponent(); 
    } 


    private void dtpFrom_ValueChanged(object sender, EventArgs e) 
    { 

    } 

    private void btnExtract_Click(object sender, EventArgs e) 
    { 

     SqlConnection objConn = new SqlConnection("Data Source=test;Initial Catalog=test;Persist Security Info=True;User ID=test;Password=test"); 

     System.Data.SqlClient.SqlConnection(conStr); 
     objConn.Open(); 

     SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM Invoice WHERE (InvDate >= CONVERT(datetime, '"+dtpFrom.Text +"', 105)) AND (InvDate <= CONVERT(datetime, '"+dtpTo.Text+"', 105))", objConn); 

     SqlDataReader objReader; 
     objReader = objCmd.ExecuteReader(); 

     System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", System.IO.FileMode.Create); 
     System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default); 

     int count = 0; 
     while (objReader.Read()) 
     { 

      for (int i = 0; i < 5; i++) 
      { 
       if (!objReader.IsDBNull(i)) 
       { 
        string s; 
        s = objReader.GetDataTypeName(i); 
        //MessageBox.Show(s); 
        if (objReader.GetDataTypeName(i) == "char") 
        { 
         sw.Write(objReader.GetString(i)); 
        } 
        else if (objReader.GetDataTypeName(i) == "money") 

        { 
         sw.Write(objReader.GetSqlMoney(i).ToString()); 
        } 
        else if (objReader.GetDataTypeName(i) == "nvarchar") 
        { 
         sw.Write(objReader.GetString(i)); 
        } 
       } 
       if (i < 4) 
       { 
        sw.Write("\t"); 
       } 

      } 
      count = count + 1; 
      sw.WriteLine(); 

     } 
     sw.Flush(); 
     fs.Close(); 
     objReader.Close(); 
     objConn.Close(); 
     MessageBox.Show(count + " records exported successfully."); 
     this.Close(); 
    } 

    private void groupBox1_Enter(object sender, EventArgs e) 
    { 

    } 

    private void dtpTo_ValueChanged(object sender, EventArgs e) 
    { 

    } 

    private void frmSales_Load(object sender, EventArgs e) 
    { 

    } 
} 
} 

這裏是表結構:

http://i45.tinypic.com/2cwu2j6.png

這裏是第二個表結構:

http://i45.tinypic.com/29yplvl.png

回答

1

要查詢在多個表中的數據,你要join the tables。我不是你的兩個表之間的關係100%清楚,但如果MedicalRecordID是正確的關係,那麼你的查詢應該是這個樣子:

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) 
; 

這工作如果有一個對一表格之間的關係,以及每個發票總是有一個PatientDetails記錄。如果PatientDetails是可選的,則使用LEFT JOIN而不是INNER JOIN

EDIT(響應評論):

我敢打賭,日期時間轉換在WHERE子句中不工作您預期的方式。假設dtpFromdtpToDatePicker控件,則可能需要使用SelectedDate屬性而不是Text。另外,我強烈建議在查詢中使用參數,而不是連接字符串。你的代碼會更乾淨,你會避免SQL injection。這裏有一個簡單的例子:

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 
    } 
} 
+0

謝謝你的回覆。當我執行查詢MSSQL時,它完全是我想要的。但是,當我轉移到VB命令,它並沒有告訴我,什麼是在MSSQL中顯示。 SqlCommand objCmd = new SqlCommand(「SELECT CONVERT(char(80),i.InvDate,3)AS InvDate,i.InvoiceNo,i.EmployerCode,i.TaxAmount + i.SubTotal AS Amount,''AS付款,pd.GivenName FROM dbo.Invoice i LEFT JOIN dbo.PatientDetails pd ON(pd.MedicalRecordID = i.MedicalRecordID)WHERE(InvDate> = CONVERT(datetime,'「+ dtpFrom.Text +」',105))AND InvDate <= CONVERT(datetime,'「+ dtpTo.Text +」',105))「,objConn);' – Newbie

+0

嗨,先生,經過6個小時的訓練後,您的編碼和幫助。它不會過濾日期和patientdetails.givenname不顯示在TXT輸出 – Newbie

+1

我會複製/粘貼上述查詢從C#到Management Studio(複製/粘貼引號內的所有內容,而不會改變引號內的任何內容),然後添加兩個查詢前的變量聲明('DECLARE @fromDate DATETIME ='2012-10-01 00:00''和'DECLARE @toDate DATETME ='2012-10-11 00:00'')。如果查詢在Management Studio中工作,則返回到C#代碼並設置斷點並檢查兩個「SelectedDate」字段以確認它們是正確的。如果查詢在Management Studio中未產生預期的結果,那麼您需要處理查詢。 – cbranch