Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用SUM/Group By进行查询时出现问题_Sql_Oracle - Fatal编程技术网

Sql 使用SUM/Group By进行查询时出现问题

Sql 使用SUM/Group By进行查询时出现问题,sql,oracle,Sql,Oracle,我有一个Oracle SQL查询,我想用它来查询几个金额列和一些描述性列的总数。简而言之,我希望输出如下: INDBDebnmbr INInvoicenmbr INOpenAmount 40 10 100 40 14 125 35 20 200 60 21 75 我的质询: SELECT TRIM(A.ACCOUNTNUMBER) AS

我有一个Oracle SQL查询,我想用它来查询几个金额列和一些描述性列的总数。简而言之,我希望输出如下:

INDBDebnmbr INInvoicenmbr INOpenAmount
40          10            100
40          14            125
35          20            200
60          21            75
我的质询:

SELECT TRIM(A.ACCOUNTNUMBER) AS INDBDebnmbr
     , TRIM(A.VOUCHER) AS INinvoicenmbr
     , A.DATE_ AS INinvoiceDate
     , A.DUEDATE AS INinvoiceDueDate
     , A.TXT AS INDescription
     , A.EXCHANGECODE AS INCurrencyCode
     , subq.AMOUNTMST AS INOriginalamount
     , subq.SETTLEAMOUNTMST AS INpaidAmount
     , subq.OPENAMOUNT AS INOpenAmount
FROM (
            SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                    SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                    SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                    SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
            FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
            WHERE DEBTRANS.OPEN = 1 
            AND DEBTRANS.TRANSTYPE <> 9 
            AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
            AND DEBTRANS.DATASET = 'FIK'
            GROUP BY DEBTRANS.VOUCHER
        ) subq, 
       XAL_SUPERVISOR.DEBTRANS A 
WHERE subq.VOUCHER = A.VOUCHER 
GROUP BY    A.VOUCHER, 
            A.ACCOUNTNUMBER,
            A.DATE_, 
            A.DUEDATE, 
            A.TXT, 
            A.EXCHANGECODE,
            subq.AMOUNTMST, 
            subq.SETTLEAMOUNTMST, 
            subq.OPENAMOUNT
如何通过带描述性列的DEBTRANS.凭单获得正确的金额

提前感谢,

Mike

在子查询subq中,在caluse所在的位置添加另一个条件


这意味着主查询的凭证必须与子查询凭证编号相匹配。

您不必要地重新连接到表以获取其他列。我猜问题在于您没有为表的外部实例重复筛选条件

这是你想要的吗

        SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
                TRIM(DEBTRANS.ACCOUNTNUMBER) AS INDBDebnmbr
              , DEBTRANS.DATE_ AS INinvoiceDate
              , DEBTRANS.DUEDATE AS INinvoiceDueDate
              , DEBTRANS.TXT AS INDescription
              , DEBTRANS.EXCHANGECODE AS INCurrencyCode
        FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
        WHERE DEBTRANS.OPEN = 1 
        AND DEBTRANS.TRANSTYPE <> 9 
        AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
        AND DEBTRANS.DATASET = 'FIK'
        GROUP BY DEBTRANS.VOUCHER
                ,DEBTRANS.ACCOUNTNUMBER
                ,DEBTRANS.DATE_
                ,DEBTRANS.DUEDATE
                ,DEBTRANS.TXT
                ,DEBTRANS.EXCHANGECODE
如果不是,则假定这些附加列中的一个或多个没有凭证的唯一值。在这种情况下,您需要决定如何为每个组选择要显示的值。例如,您可以选择如下所示的最大值,但这对您的业务逻辑有意义吗

        SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
                MAX(TRIM(DEBTRANS.ACCOUNTNUMBER)) AS INDBDebnmbr
              , MAX(DEBTRANS.DATE_) AS INinvoiceDate
              , MAX(DEBTRANS.DUEDATE) AS INinvoiceDueDate
              , MAX(DEBTRANS.TXT) AS INDescription
              , MAX(DEBTRANS.EXCHANGECODE) AS INCurrencyCode
        FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
        WHERE DEBTRANS.OPEN = 1 
        AND DEBTRANS.TRANSTYPE <> 9 
        AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
        AND DEBTRANS.DATASET = 'FIK'
        GROUP BY DEBTRANS.VOUCHER

似乎您不需要按日期分组,因为某些发票的日期总是唯一的?建议:使用JOIN而不是WHERE,使您的代码更易于阅读每个凭证有几个不同的DUEDATE,哪个值最小/最大等。还是要在查询输出中检索?或者它是无趣的,可以完全忽略吗?@niktrs duedate总是一样的,但由于表debtrans也有结算记录,我不确定mark guk的_日期。假设我忘记了按日期分组,我还能在发票号码旁边显示它们吗?或者这两个号码是绑定在一起的吗?谢谢Talha,但是…debturans.DATASET='FIK'和debturans.VOUCHER=A.VOUCHER给了我无效的列名?这个谓词已经存在于主查询的WHERE子句中。但是内部查询没有这个谓词实际计算相同凭单金额的值。
        SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
                TRIM(DEBTRANS.ACCOUNTNUMBER) AS INDBDebnmbr
              , DEBTRANS.DATE_ AS INinvoiceDate
              , DEBTRANS.DUEDATE AS INinvoiceDueDate
              , DEBTRANS.TXT AS INDescription
              , DEBTRANS.EXCHANGECODE AS INCurrencyCode
        FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
        WHERE DEBTRANS.OPEN = 1 
        AND DEBTRANS.TRANSTYPE <> 9 
        AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
        AND DEBTRANS.DATASET = 'FIK'
        GROUP BY DEBTRANS.VOUCHER
                ,DEBTRANS.ACCOUNTNUMBER
                ,DEBTRANS.DATE_
                ,DEBTRANS.DUEDATE
                ,DEBTRANS.TXT
                ,DEBTRANS.EXCHANGECODE
        SELECT  DEBTRANS.VOUCHER AS VOUCHER, 
                SUM(DEBTRANS.AMOUNTMST) AS AMOUNTMST, 
                SUM(DEBTRANS.SETTLEAMOUNTMST) AS SETTLEAMOUNTMST, 
                SUM(DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) AS OPENAMOUNT
                MAX(TRIM(DEBTRANS.ACCOUNTNUMBER)) AS INDBDebnmbr
              , MAX(DEBTRANS.DATE_) AS INinvoiceDate
              , MAX(DEBTRANS.DUEDATE) AS INinvoiceDueDate
              , MAX(DEBTRANS.TXT) AS INDescription
              , MAX(DEBTRANS.EXCHANGECODE) AS INCurrencyCode
        FROM XAL_SUPERVISOR.DEBTRANS DEBTRANS 
        WHERE DEBTRANS.OPEN = 1 
        AND DEBTRANS.TRANSTYPE <> 9 
        AND (DEBTRANS.AMOUNTMST - DEBTRANS.SETTLEAMOUNTMST) <> 0 
        AND DEBTRANS.DATASET = 'FIK'
        GROUP BY DEBTRANS.VOUCHER