添加两个查询 - SQL/HANA
Addition of two queries - SQL/HANA
正在尝试执行以下 HANA 查询。
以下查询生成 TotalBal Between '01.07.2020' AND '31.03.2021'
如果这个查询 returns 1000.
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.07.2020' AND '31.03.2021'
GROUP BY T1."AcctName"
并且此查询的日期介于“01.01.0001”和“06.30.2021”之间 returns 500,因此最终结果应为 1500。
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as PreviousBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.01.0001' AND (add_days('01.07.2020', -1))
GROUP BY T1."AcctName"
所以,我将它们结合起来,我得到了这个,但它不起作用。任何帮助将不胜感激。
SELECT T1."AcctName", SUM(Balance)
FROM
(
SELECT SUM(T0."Debit") - SUM(T0."Credit") as Balance
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.07.2020' AND '31.03.2021'
UNION ALL
SELECT SUM(T0."Debit") - SUM(T0."Credit") as Balance
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.01.0001' AND (add_days('01.07.2020', -1))
)
GROUP BY T1."AcctName"
看来两个单独查询的组合方式不对。
UNION
ed 子查询不投影结果分组所需的 AcctName
列。
原始问题中查询应该执行的操作的文本描述误导性地指出两个查询中使用的数据范围重叠。
查看查询的实际 SQL 代码示例,很明显,Q2 旨在涵盖 Q1 数据范围之前 时间的所有有效数据。
组合查询的一种方法是 OP 尝试的 UNION
。
为此,查询需要公开相同的列,尤其是 GROUP BY
操作所需的列:
SELECT
UQ."AcctName", SUM(UQ."TotalBal") as "TotalBal"
FROM
(SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.07.2020' AND '31.03.2021'
GROUP BY T1."AcctName"
UNION ALL
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.01.0001' AND (add_days('01.07.2020', -1))
GROUP BY T1."AcctName") UQ
GROUP BY UQ."AccrtName";
然而,这是一种相当幼稚的方法来实现结果,这将导致大多数 DBMS 的性能低于必要的性能。
获得相同结果的更好方法是看到我们在这里所做的只是扩展选定的日期范围,同时确保选定的范围是仍然 连续.
根据此要求,只需调整 WHERE
子句即可重写查询:
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE
T1."AcctCode" = '12345'
AND '01.01.0001' <= T0."RefDate" -- new "outer" minimum date (from Q2)
AND '31.03.2021' >= T0."RefDate" -- new "outer" maximum date (from Q1)
GROUP BY T1."AcctName";
这行得通,因为 Q2 总是在 Q1 之前“填满”完整的日期范围。
正在尝试执行以下 HANA 查询。 以下查询生成 TotalBal Between '01.07.2020' AND '31.03.2021' 如果这个查询 returns 1000.
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.07.2020' AND '31.03.2021'
GROUP BY T1."AcctName"
并且此查询的日期介于“01.01.0001”和“06.30.2021”之间 returns 500,因此最终结果应为 1500。
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as PreviousBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.01.0001' AND (add_days('01.07.2020', -1))
GROUP BY T1."AcctName"
所以,我将它们结合起来,我得到了这个,但它不起作用。任何帮助将不胜感激。
SELECT T1."AcctName", SUM(Balance)
FROM
(
SELECT SUM(T0."Debit") - SUM(T0."Credit") as Balance
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.07.2020' AND '31.03.2021'
UNION ALL
SELECT SUM(T0."Debit") - SUM(T0."Credit") as Balance
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.01.0001' AND (add_days('01.07.2020', -1))
)
GROUP BY T1."AcctName"
看来两个单独查询的组合方式不对。
UNION
ed 子查询不投影结果分组所需的 AcctName
列。
原始问题中查询应该执行的操作的文本描述误导性地指出两个查询中使用的数据范围重叠。 查看查询的实际 SQL 代码示例,很明显,Q2 旨在涵盖 Q1 数据范围之前 时间的所有有效数据。
组合查询的一种方法是 OP 尝试的 UNION
。
为此,查询需要公开相同的列,尤其是 GROUP BY
操作所需的列:
SELECT
UQ."AcctName", SUM(UQ."TotalBal") as "TotalBal"
FROM
(SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.07.2020' AND '31.03.2021'
GROUP BY T1."AcctName"
UNION ALL
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE T1."AcctCode" = '12345' AND
T0."RefDate" BETWEEN '01.01.0001' AND (add_days('01.07.2020', -1))
GROUP BY T1."AcctName") UQ
GROUP BY UQ."AccrtName";
然而,这是一种相当幼稚的方法来实现结果,这将导致大多数 DBMS 的性能低于必要的性能。
获得相同结果的更好方法是看到我们在这里所做的只是扩展选定的日期范围,同时确保选定的范围是仍然 连续.
根据此要求,只需调整 WHERE
子句即可重写查询:
SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal
FROM TABLE0 T0
INNER JOIN TABLE1 T1 ON T0."Account" = T1."AcctCode"
INNER JOIN TABLE2 T2 ON T0."TransId" = T2."TransId"
WHERE
T1."AcctCode" = '12345'
AND '01.01.0001' <= T0."RefDate" -- new "outer" minimum date (from Q2)
AND '31.03.2021' >= T0."RefDate" -- new "outer" maximum date (from Q1)
GROUP BY T1."AcctName";
这行得通,因为 Q2 总是在 Q1 之前“填满”完整的日期范围。