SQL - 使用第三个查询来比较前两个的结果

Posted

技术标签:

【中文标题】SQL - 使用第三个查询来比较前两个的结果【英文标题】:SQL - Using a third query to compare results of two previous 【发布时间】:2012-02-17 18:31:57 【问题描述】:

我的数据库中有两个查询从不同的表返回总计,然后我正在运行第三个查询来比较这些总计?

我需要在一个声明中执行此操作,以便我可以在我的 asp.net 站点上发布。这些查询可以合并吗?

以下是三个查询

qry_control_d_total

SELECT 
  tbl_control_d.processed_date, 
  Sum(tbl_control_d.dc_amt) 
AS 
  SumOfdc_amt, 
  tbl_currency.cur_type
FROM 
  tbl_control_d 
INNER JOIN 
  tbl_currency 
ON 
  tbl_control_d.cur_code = tbl_currency.cur_code
GROUP BY 
  tbl_control_d.processed_date, tbl_currency.cur_type
AS 
  qry_control_d_total;

qry_sap_total

SELECT 
   tbl_sap.doc_date, 
Sum
   (tbl_sap.dc_amt) 
AS 
   SumOfdc_amt, 
   tbl_sap.cur_type
FROM 
   tbl_sap
GROUP BY 
   tbl_sap.doc_date, 
   tbl_sap.cur_type
AS 
   qry_sap_total;

最终查询

SELECT 
   qry_control_d_total.processed_date, 
   qry_control_d_total.cur_type, 
   [qry_control_d_total].[sumofdc_amt]-[qry_control_d_total].[sumofdc_amt] 
AS 
   balance, 
   qry_control_d_total.SumOfdc_amt, 
   qry_sap_total.SumOfdc_amt
FROM 
   qry_control_d_total 
INNER JOIN 
   qry_sap_total 
ON 
   (qry_control_d_total.processed_date = qry_sap_total.doc_date) 
AND 
   (qry_control_d_total.cur_type = qry_sap_total.cur_type);

欢迎提出建议


这是我在我的 vb.net 页面中使用的子

sub page_load
    lblyear.text = dateTime.Now.ToString("yyyy")
    Dim objconn as new oledbconnection("provider=Microsoft.jet.oledb.4.0;data source=F:\CCMI\asp\db\control.mdb")
    Dim objcmd As Oledbcommand
    Dim objRdr as OledbDatareader
    Dim strCmd as string
    Dim objDA as oleDbDataAdapter
    if not ispostback then
        '****************
        objcmd = new oledbcommand("SELECT...", objconn)
                objconn.open()
                objRdr = objcmd.executereader()
                dgbal_mc_roi.datasource = objrdr
                dgbal_mc_roi.databind()
                objrdr.close()
                objconn.close()
    end if
end sub

【问题讨论】:

【参考方案1】:

你快到了,你需要使用你以前的查询作为派生表:

SELECT 
   qry_control_d_total.processed_date, 
   qry_control_d_total.cur_type, 
   qry_control_d_total.[sumofdc_amt]-qry_control_d_total.[sumofdc_amt] 
AS 
   balance, 
   qry_control_d_total.SumOfdc_amt, 
   qry_sap_total.SumOfdc_amt
FROM (  SELECT tbl_control_d.processed_date, Sum(tbl_control_d.dc_amt) AS SumOfdc_amt, tbl_currency.cur_type
        FROM tbl_control_d 
        INNER JOIN tbl_currency 
        ON tbl_control_d.cur_code = tbl_currency.cur_code
        GROUP BY tbl_control_d.processed_date, tbl_currency.cur_type) AS qry_control_d_total 
INNER JOIN (SELECT tbl_sap.doc_date, Sum(tbl_sap.dc_amt) AS SumOfdc_amt, tbl_sap.cur_type
            FROM tbl_sap
            GROUP BY tbl_sap.doc_date, tbl_sap.cur_type) AS qry_sap_total 
ON qry_control_d_total.processed_date = qry_sap_total.doc_date
AND qry_control_d_total.cur_type = qry_sap_total.cur_type

【讨论】:

当我在我的数据库中测试它时这有效,但是当我在我的 .net 站点上尝试时,我得到“qry_control_d_total.processed_date”在选定的数据源上找不到???非常感谢您的帮助,因为这比我得到的要远得多! @Barry - 也许它需要用AS 明确命名派生表,我在我的答案中添加了。无论如何,它可能有很多东西,您需要向我们提供更多信息,您使用的是什么数据库引擎?您如何从您的站点连接到您的数据库? sub page_load lblyear.text = dateTime.Now.ToString("yyyy") Dim objconn as new oledbconnection("provider=Microsoft.jet.oledb.4.0;data source=F:\CCMI\asp \db\control.mdb") Dim objcmd As Oledbcommand Dim objRdr as OledbDatareader Dim strCmd as string Dim objDA as oleDbDataAdapter if not ispostback then '****************** objcmd = new oledbcommand( "SELECT...", objconn) objconn.open() objRdr = objcmd.executereader() dgbal_mc_roi.datasource = objrdr dgbal_mc_roi.databind() objrdr.close() objconn.close() end if end sub @Barry - 所以这是 Access 和基本的,对吧?您是否尝试过我发布的新查询?除此之外,我不知道如何解决此错误。 我已经开始工作了,查询绝对没问题,我的问题是我的数据网格从查询中选择了正确的字段来显示。【参考方案2】:

尝试做一件事

如果您在存储过程中执行这些查询,

将第一个查询的结果放入一个临时表中,然后 将第二个表的结果放到另一个临时表中

为这两个临时表编写一个连接查询!

【讨论】:

Access 中的存储过程以及临时表? 对不起先生,我以为你是在 sql server 中做的。

以上是关于SQL - 使用第三个查询来比较前两个的结果的主要内容,如果未能解决你的问题,请参考以下文章

sql查询结果部分替换

SQL Server比较两个应该相同的查询的结果

SQL查询结果替换???????

SQL语句的MINUS,INTERSECT和UNION ALL

将两个查询结果存储在第三个变量中

SQL Server 在查询结果增加自定义的三个字段?如何搞?