dotnetcore / FreeSql

🦄 .NET aot orm, C# orm, VB.NET orm, Mysql orm, Postgresql orm, SqlServer orm, Oracle orm, Sqlite orm, Firebird orm, 达梦 orm, 人大金仓 orm, 神通 orm, 翰高 orm, 南大通用 orm, 虚谷 orm, 国产 orm, Clickhouse orm, QuestDB orm, MsAccess orm.
http://freesql.net
MIT License
4.1k stars 857 forks source link

自动分表求和生成了多个结构,没有把结果相加。 #1115

Closed sukney closed 2 years ago

sukney commented 2 years ago

版本 3.2.650-preview20220515 oracle 11g 数据库 代码 var q = _workSaleRepository.Select .From<GOODSDOC, BUSINESSDOC>((a, b, c) => a.LeftJoin(z => z.GOODSID == b.GOODSID && z.ENTID == b.ENTID) .LeftJoin(z => z.CLIENTID == c.BusinessId && z.ENTID == c.EntId)) .Where((x, a, b) => x.DATETIME >= beg && x.DATETIME < end) .ToAggregate((x, b, c) => new { total = x.Count(), totalNum = x.Sum(x.Key.NUM), totalAmount = x.Sum(x.Key.TAXAMOUNT), }); 生成的语句如下

SELECT * from (SELECT count(1) as1, sum(a."NUM") as2, sum(a."TAXAMOUNT") as3 FROM "WORK_SA_202106" a LEFT JOIN "VIW_GOODSDOC" b ON a."GOODSID" = b."GOODSID" AND a."ENTID" = b."ENTID" LEFT JOIN "VIW_BUSINESSDOC" c ON a."CLIENTID" = c."BUSINESSID" AND a."ENTID" = c."ENTID" WHERE (a."DATETIME" >= to_timestamp('2021-03-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') AND a."DATETIME" < to_timestamp('2021-06-06 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))) ftb

UNION ALL

SELECT * from (SELECT count(1) as1, sum(a."NUM") as2, sum(a."TAXAMOUNT") as3 FROM "WORK_SA_202105" a LEFT JOIN "VIW_GOODSDOC" b ON a."GOODSID" = b."GOODSID" AND a."ENTID" = b."ENTID" LEFT JOIN "VIW_BUSINESSDOC" c ON a."CLIENTID" = c."BUSINESSID" AND a."ENTID" = c."ENTID" WHERE (a."DATETIME" >= to_timestamp('2021-03-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') AND a."DATETIME" < to_timestamp('2021-06-06 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))) ftb

UNION ALL

SELECT * from (SELECT count(1) as1, sum(a."NUM") as2, sum(a."TAXAMOUNT") as3 FROM "WORK_SA_202104" a LEFT JOIN "VIW_GOODSDOC" b ON a."GOODSID" = b."GOODSID" AND a."ENTID" = b."ENTID" LEFT JOIN "VIW_BUSINESSDOC" c ON a."CLIENTID" = c."BUSINESSID" AND a."ENTID" = c."ENTID" WHERE (a."DATETIME" >= to_timestamp('2021-03-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') AND a."DATETIME" < to_timestamp('2021-06-06 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))) ftb

UNION ALL

SELECT * from (SELECT count(1) as1, sum(a."NUM") as2, sum(a."TAXAMOUNT") as3 FROM "WORK_SA_202103" a LEFT JOIN "VIW_GOODSDOC" b ON a."GOODSID" = b."GOODSID" AND a."ENTID" = b."ENTID" LEFT JOIN "VIW_BUSINESSDOC" c ON a."CLIENTID" = c."BUSINESSID" AND a."ENTID" = c."ENTID" WHERE (a."DATETIME" >= to_timestamp('2021-03-01 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6') AND a."DATETIME" < to_timestamp('2021-06-06 00:00:00.000000','YYYY-MM-DD HH24:MI:SS.FF6'))) ftb 下图是plsql语句的结果,变成了四条记录 image

2881099 commented 2 years ago

目前自动分表,多表查询,聚合查询是测试盲区。

主要针对单表,特定的查询有效。

sukney commented 2 years ago

这个有没好的办法解决下

2881099 commented 2 years ago

我尝试解决一下,有结果了回复

2881099 commented 2 years ago

ToAggregate 新版本会翻译成这样执行:

SELECT  sum(ftba."click") as1, count(1) as2, avg(ftba."click") as3, min(ftba."click") as4, max(ftba."click") as5 FROM ( 
    SELECT  * from (SELECT a."click" 
    FROM "as_table_log_202204" a 
    WHERE (a."createtime" < '2022-05-01 00:00:00')) ftb

    UNION ALL

    SELECT  * from (SELECT a."click" 
    FROM "as_table_log_202203" a 
    WHERE (a."createtime" < '2022-05-01 00:00:00')) ftb

    UNION ALL

    SELECT  * from (SELECT a."click" 
    FROM "as_table_log_202202" a 
    WHERE (a."createtime" < '2022-05-01 00:00:00')) ftb

    UNION ALL

    SELECT  * from (SELECT a."click" 
    FROM "as_table_log_202201" a 
    WHERE (a."createtime" < '2022-05-01 00:00:00')) ftb
) ftba
sukney commented 2 years ago

帮发个版本,谢谢

2881099 commented 2 years ago

v3.2.650-preview20220526

sukney commented 2 years ago

nuget 搜不到 v3.2.650-preview20220526 版本。

2881099 commented 2 years ago

nuget 搜不到 v3.2.650-preview20220526 版本。

nuget 抽风,两个多小时还没成功,发布了v3.2.651