【发布时间】:2019-11-23 15:43:55
【问题描述】:
我需要帮助优化我的查询,因为我们的 SAP HANA 环境在尝试运行以下命令时一直失败。
我只是想获取年初至今的发票数据以及发票是否打开。我们存储发票行及其状态(打开/关闭),不幸的是,我们本身不存储发票编号,但发票编号存储在两个字段之一中,具体取决于“Sales_Document_Type”。
因此,我编写了以下查询来检索所有发票、一个 CASE 语句标志来识别打开/关闭和最后一个 Clearing_Date。我相当肯定这会起作用,但我正在寻求帮助,建议优化它的方法,因为它无法以当前形式处理。
SELECT
CASE
WHEN A."Sales_Document_Type" IN ('A','B','C') THEN A."Accounting_Document_No"
ELSE A."Assignment_Number" END AS "Invoice_Number",
CASE
WHEN A."Sales_Document_Type" IN ('A','B','C') THEN (
CASE
WHEN B."Accounting_Document_No" IS NULL THEN 'C'
ELSE 'O' END
)
ELSE (
CASE
WHEN B."Accounting_Document_No" IS NULL THEN 'C'
ELSE 'O' END
)
END AS "Open_Close_Flag",
MAX(A."Clearing_Date") AS "Clearing_Date"
FROM
"AccountsReceivable" A
LEFT JOIN
"AccountsReceivable" B ON (A."Assignment_Number" = B."Assignment_Number" OR A."Accounting_Document_No" = B."Accounting_Document_No") AND B."OpenClose_Flag" = 'O' AND B."Creation_Date" >= '2019-01-01'
WHERE
A."Creation_Date" >= '2019-01-01'
GROUP BY
CASE
WHEN A."Sales_Document_Type" IN ('A','B','C') THEN A."Accounting_Document_No"
ELSE A."Assignment_Number" END,
CASE
WHEN A."Sales_Document_Type" IN ('A','B','C') THEN (
CASE
WHEN B."Accounting_Document_No" IS NULL THEN 'C'
ELSE 'O' END
)
ELSE (
CASE
WHEN B."Accounting_Document_No" IS NULL THEN 'C'
ELSE 'O' END
)
END
“AccountsReceivable”表中的示例数据如下所示(标签缩写):
Sales_Doc_Type | Accounting_Doc_# | Assignment_# | Line | OpenClose_F | Clearing_Date
A | 1234 | 5678 | 1 | O |
A | 1234 | 5678 | 2 | C | 2019-10-01
C | 1235 | 5679 | 1 | O |
D | 1001 | 9876 | 1 | O |
D | 1001 | 9876 | 2 | C | 2019-10-01
D | 1002 | 9870 | 1 | C | 2019-10-05
D | 1002 | 9870 | 2 | C | 2019-10-09
需要注意的是,文档有多行,每行可以是打开的(OpenClose_Flag of O)或关闭的(C)。我想要的输出是 Accounting_Document_No 或 Assignment_Number AS Invoice_Number(取决于 sales_document_type),如果任何行都是 O,则为 O,如果所有行均为 C,则为 C,最大清算日期:
Invoice_Number | OpenClose_Flag | MAX(Clearing_Date)
1234 | O | 2019-10-01
1235 | O |
9876 | O | 2019-10-01
9870 | C | 2019-10-09
非常感谢您的帮助!
【问题讨论】:
-
请描述您要实现的逻辑。样本数据和期望的结果会有所帮助。如果没有样本数据,几乎无法理解围绕“发票”的逻辑。
-
好点,我刚刚编辑了原始帖子以包含一些示例数据和所需的结果。