添加两个查询 - 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"

看来两个单独查询的组合方式不对。

UNIONed 子查询不投影结果分组所需的 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 之前“填满”完整的日期范围。