SQL查询筛选出总和时出现问题
我需要帮助了解如何从Oracle数据库优化以下SQL查询:SQL查询筛选出总和时出现问题,sql,Sql,我需要帮助了解如何从Oracle数据库优化以下SQL查询: SELECT DISTINCT PR.DOC_ID, PR.AMEND_NO, LEDGER.ACCT_ID, APPRVL_CHAIN.APPRVR, SUM(LEDGER.COMMIT) FROM LUFSMGR.APPRVL_CHAIN APPRVL_CHAIN, LUFSMGR.LEDGER LEDGER, LUFSMGR.PR PR WHERE PR.DOC_ID =
SELECT DISTINCT
PR.DOC_ID, PR.AMEND_NO, LEDGER.ACCT_ID, APPRVL_CHAIN.APPRVR,
SUM(LEDGER.COMMIT)
FROM
LUFSMGR.APPRVL_CHAIN APPRVL_CHAIN,
LUFSMGR.LEDGER LEDGER,
LUFSMGR.PR PR
WHERE
PR.DOC_ID = LEDGER.DOC_ID
AND LEDGER.DOC_ID = APPRVL_CHAIN.DOC_ID
AND APPRVL_CHAIN.AMEND_NO = LEDGER.AMEND_NO
AND LEDGER.AMEND_NO = PR.AMEND_NO
AND ((PR.DOC_ID Like '2116%')
AND (LEDGER.ACCT_ID Like '25601 105300SD%')
AND (APPRVL_CHAIN.APPRVR_ROLE='Funds Manager'))
GROUP BY
PR.DOC_ID, PR.AMEND_NO, LEDGER.ACCT_ID, APPRVL_CHAIN.APPRVR
HAVING
(SUM(LEDGER.COMMIT) <> 0)
ORDER BY
PR.DOC_ID
选择DISTINCT
请购单ID、请购单修订号、分类账账户ID、APPRVL\u CHAIN.APPRVR、,
金额(分类账提交)
从…起
LUFSMGR.APPLVL_链APPLVL_链,
LUFSMGR.分类账,
LUFSMGR.PR
哪里
PR.DOC\u ID=分类帐.DOC\u ID
和LEDGER.DOC\u ID=APPRVL\u CHAIN.DOC\u ID
和APPRVL_CHAIN.AMEND_NO=分类账.AMEND_NO
和分类账.AMEND\u NO=PR.AMEND\u NO
和((PR.DOC_ID像“2116%”)
和(LEDGER.ACCT_ID如“25601 105300SD%”)
和(APPRVL_CHAIN.APPRVR_ROLE='Funds Manager'))
分组
请购单ID、请购单修订号、分类账账户ID、APPRVL\u CHAIN.APPRVR
有
(金额(分类账提交)0)
订购人
PR.DOC\u ID
这将生成样本如下所示的数据:
我需要过滤掉所有承诺(包括修订)之和等于0的文档ID。例如,应过滤掉文档ID 21162465SD541,因为编号0、1和2的总和为0。如果需要文档级别的信息,则仅将其包含在
分组依据中:
SELECT PR.DOC_ID, Sum(LEDGER.COMMIT)
FROM LUFSMGR.APPRVL_CHAIN APPRVL_CHAIN JOIN
LUFSMGR.LEDGER LEDGER
ON LEDGER.DOC_ID = APPRVL_CHAIN.DOC_ID AND APPRVL_CHAIN.AMEND_NO = LEDGER.AMEND_NO JOIN
LUFSMGR.PR PR
ON PR.DOC_ID = LEDGER.DOC_ID AND AND LEDGER.AMEND_NO = PR.AMEND_NO
WHERE (PR.DOC_ID Like '2116%') AND
(LEDGER.ACCT_ID Like '25601 105300SD%') AND
(APPRVL_CHAIN.APPRVR_ROLE = 'Funds Manager')
GROUP BY PR.DOC_ID
HAVING Sum(LEDGER.COMMIT) <> 0
ORDER BY PR.DOC_ID;
选择PR.DOC\u ID,Sum(分类账.提交)
从LUFSMGR.APPLVL_链APPLVL_链连接
LUFSMGR.分类账
在LEDGER.DOC\u ID=APPRVL\u CHAIN.DOC\u ID和APPRVL\u CHAIN.AMEND\u NO=LEDGER.AMEND\u NO连接上
LUFSMGR.PR
在PR.DOC\u ID=LEDGER.DOC\u ID和LEDGER.AMEND\u NO=PR.AMEND\u NO上
其中(PR.DOC_ID像“2116%”)和
(LEDGER.ACCT_ID如“25601 105300SD%”)和
(APPRVL_CHAIN.APPRVR_角色=‘基金经理’)
按PR.DOC\u ID分组
具有总和(分类帐.提交)0
按PR.DOC\u ID订购;
注:
- 学习使用正确的
JOIN
语法。简单规则:切勿在FROM
子句中使用逗号
- 使用
selectdistinct
和groupby
几乎从来都不是正确的做法
如果您需要文档级别的信息,则只需将其包含在分组中:
SELECT PR.DOC_ID, Sum(LEDGER.COMMIT)
FROM LUFSMGR.APPRVL_CHAIN APPRVL_CHAIN JOIN
LUFSMGR.LEDGER LEDGER
ON LEDGER.DOC_ID = APPRVL_CHAIN.DOC_ID AND APPRVL_CHAIN.AMEND_NO = LEDGER.AMEND_NO JOIN
LUFSMGR.PR PR
ON PR.DOC_ID = LEDGER.DOC_ID AND AND LEDGER.AMEND_NO = PR.AMEND_NO
WHERE (PR.DOC_ID Like '2116%') AND
(LEDGER.ACCT_ID Like '25601 105300SD%') AND
(APPRVL_CHAIN.APPRVR_ROLE = 'Funds Manager')
GROUP BY PR.DOC_ID
HAVING Sum(LEDGER.COMMIT) <> 0
ORDER BY PR.DOC_ID;
选择PR.DOC\u ID,Sum(分类账.提交)
从LUFSMGR.APPLVL_链APPLVL_链连接
LUFSMGR.分类账
在LEDGER.DOC\u ID=APPRVL\u CHAIN.DOC\u ID和APPRVL\u CHAIN.AMEND\u NO=LEDGER.AMEND\u NO连接上
LUFSMGR.PR
在PR.DOC\u ID=LEDGER.DOC\u ID和LEDGER.AMEND\u NO=PR.AMEND\u NO上
其中(PR.DOC_ID像“2116%”)和
(LEDGER.ACCT_ID如“25601 105300SD%”)和
(APPRVL_CHAIN.APPRVR_角色=‘基金经理’)
按PR.DOC\u ID分组
具有总和(分类帐.提交)0
按PR.DOC\u ID订购;
注:
- 学习使用正确的
JOIN
语法。简单规则:切勿在FROM
子句中使用逗号
- 使用
selectdistinct
和groupby
几乎从来都不是正确的做法
出了什么问题?到底是什么问题在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSIJOIN
语法所取代,它的使用不受欢迎。出了什么问题?到底是什么问题在ANSI-92 SQL标准(20多年前)中,旧式的逗号分隔表列表样式被正确的ANSIJOIN
语法所取代,它的使用受到了阻碍。挑战是我仍然需要Ammend\u No,总承诺额不为0的文档的帐户ID和appvr。您可以使用JOIN
或中的进行此查询以获取更多详细信息。挑战在于我仍然需要Ammend\u编号,总承付额不为0的文档的帐户ID和appvr。您可以将加入或中的与此查询一起使用,以获取其他详细信息。