Sql 使用SUM/Group By进行查询时出现问题
我有一个Oracle SQL查询,我想用它来查询几个金额列和一些描述性列的总数。简而言之,我希望输出如下: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
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