添加了两个查询-SQL/HANA

添加了两个查询-SQL/HANA,sql,hana,Sql,Hana,正在尝试执行以下HANA查询。 以下查询生成“2020年7月1日”和“2021年3月31日”之间的TotalBal 如果此查询返回1000 SELECT T1."AcctName", SUM(T0."Debit") - SUM(T0."Credit") as TotalBal FROM TABLE0 T0 INNER JOIN TABLE1 T1 ON T0."Account" = T1.&quo

正在尝试执行以下HANA查询。 以下查询生成“2020年7月1日”和“2021年3月31日”之间的TotalBal 如果此查询返回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'之间,则返回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"

两个单独查询的组合方式似乎是错误的

联合子查询不投影分组结果所需的AcctName列

原始问题中对查询应该做什么的文本描述误导性地指出,两个查询中使用的数据范围重叠。 查看查询的实际SQL代码示例,很明显,Q2旨在覆盖Q1中数据范围之前的所有有效数据

组合查询的一种方法是OP尝试的联合。 为此,查询需要公开相同的列,尤其是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子句即可重写查询:


这是可行的,因为第二季度总是在第一季度之前填写完整的日期范围。

我不认为您正在使用mysql,所以您应该删除该标记。当你说它不起作用的时候?您是否收到错误消息?你得到的结果是否与你预期的不同?还有,为什么要使用union而不是仅仅扩展WHERE?Hana、sql server、sql、mysql???你忘了甲骨文,MongoDB,Cassandra,Hive,Neo4J等等on@nacho. 如果仔细看,SQL和HANA的唯一区别是双引号。i、 e列名应在双引号中。所以我把所有的都贴上了相似的标签。不,你也把sql server和mysql贴上了标签,然后把它们删除了。联合查询中没有AcctName-从。。。没有别名。上面的查询将不会运行。感谢它的工作。01.01.0001'=T0.REF日期。真的很欣赏它。再次感谢你。。。上帝保佑兄弟。你好,兄弟,你能在这个问题上分享你的智慧吗。谢谢
 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";