2012-03-20 96 views
0

我有3個查詢:將3個查詢連接到1個表時如何查詢?

// (1) 
String sql = "SELECT tblClientInfo.ClientID, tblrefmarket.MarketDesc, tblclientinfo.LastName, tblledger.LoanAmount, " 
+ "tblledger.DateStarted, tblledger.DailyPay, tblledger.Expiry FROM tblclientinfo Inner Join tblbusinessinfo ON tblbusinessinfo.ClientID = tblclientinfo.ClientID " 
+ "Inner Join tblrefmarket ON tblbusinessinfo.MarketID = tblrefmarket.MarketID " 
+ "Inner Join tblledger ON tblledger.ClientID = tblclientinfo.ClientID where MarketDesc = ?"; 

// (2) 
String sumSQL = "SELECT ClientID, sum(tblloanpayment.AmountPaid) as sum FROM tblloanpayment where tblloanpayment.ClientID= ? "; 

// (3) 
String balSQL = "SELECT (SELECT tblLedger.LoanAmount from tblLedger WHERE tblLedger.ClientID = ?) - (SELECT SUM(tblLoanPayment.AmountPaid) " 
+ "FROM tblLoanPayment WHERE tblLoanPayment.ClientID = ?) as balance FROM dual; "; 

我已執行這3個查詢上顯示一個JTable信息。它是成功的。

現在我的問題是當我使用JasperReports生成報告(或打印)。

我只能顯示第一個查詢,因爲它在數據庫中。雖然查詢2和3不是。它們只是在查詢1中進行的付款的計算。

如何加入此項目以便我能夠顯示所有必要的信息?

這裏是我的代碼:

private void cmdPrintActionPerformed(java.awt.event.ActionEvent evt) { 
    int row = tableMarket.getSelectedRow(); 
    try { 
     JasperDesign jasperDesign = JRXmlLoader.load("notes receivables.jrxml"); 
     String sql = "SELECT tblClientInfo.ClientID, tblrefmarket.MarketDesc, tblclientinfo.LastName, tblledger.LoanAmount, " 
       + "tblledger.DateStarted, tblledger.DailyPay, tblledger.Expiry FROM tblclientinfo Inner Join tblbusinessinfo ON tblbusinessinfo.ClientID = tblclientinfo.ClientID " 
       + "Inner Join tblrefmarket ON tblbusinessinfo.MarketID = tblrefmarket.MarketID " 
       + "Inner Join tblledger ON tblledger.ClientID = tblclientinfo.ClientID where MarketDesc = '" + tableMarket.getModel().getValueAt(row, 0).toString() + "'"; 
     JRDesignQuery newQuery = new JRDesignQuery(); 
     newQuery.setText(sql); 
     jasperDesign.setQuery(newQuery); 
     JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
     JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, conn); 
     JasperViewer.viewReport(jasperPrint); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

此代碼只顯示第一個查詢。

+0

您的查詢中有不同的數據結構。如何結合這些數據?你的問題目前還不清楚 – 2012-03-20 06:20:28

回答

1

您的第一個查詢中已經選擇了tblLedger.LoanAmount,因此第二個和第三個查詢所需的唯一附加信息是sum(tblloanpayment.AmountPaid)。請嘗試:

SELECT c.ClientID, 
     m.MarketDesc, 
     c.LastName, 
     l.LoanAmount, 
     l.DateStarted, 
     l.DailyPay, 
     l.Expiry, 
     s.sumPaid, 
     l.LoanAmount - s.sumPaid as balance 
FROM tblclientinfo c 
Inner Join tblbusinessinfo b ON b.ClientID = c.ClientID 
Inner Join tblrefmarket m ON b.MarketID = m.MarketID 
Inner Join tblledger l ON l.ClientID = c.ClientID 
left join (SELECT ClientID, sum(AmountPaid) as sumPaid 
      FROM tblloanpayment group by ClientID) s on c.ClientID = s.ClientID 
where m.MarketDesc = ? 
+0

非常感謝。有效 :) – zairahCS 2012-03-20 19:41:12

0

在第二個和第三個查詢中刪除客戶端ID的限制。使它們成爲子查詢(即將它們放在括號內),並作出一個大的選擇,將客戶端ID上的所有三個子查詢結合起來。

編輯

因此,如果三個查詢是QUERY1,QUERY2,QUERY3,你會最終

select ... from (query1) baseSql 
join (query2) sumSql on baseSql.clientId = sumSql.clientId 
join (query3) balSql on baseSql.clientId = balSql.clientId 

您可能需要使用left join,而不是join如果有行中baseSqlsumSqlbalSql中缺少。

+0

請問我該怎麼做?謝謝 – zairahCS 2012-03-20 07:28:20

+0

什麼是basesql在這裏? – zairahCS 2012-03-20 07:56:42

+0

我用於第一個子查詢的別名。 – 2012-03-20 08:03:41