Tsql 检索多个摘要

Tsql 检索多个摘要,tsql,stored-procedures,sql-server-2012,Tsql,Stored Procedures,Sql Server 2012,在这个场景中有四个表:TableA、TableB和TableC、TableD和TableE TableA -> TableB = 1-to-many TableB -> TableC = 1-to-many TableB -> TableD = 1-to-1 TableC -> TableE = 1-to-1 TableA { Id (PK), Field1 (float), DateField (DateTime) } TableB { Id (PK), TableA

在这个场景中有四个表:TableA、TableB和TableC、TableD和TableE

TableA -> TableB = 1-to-many
TableB -> TableC = 1-to-many
TableB -> TableD = 1-to-1
TableC -> TableE = 1-to-1

TableA { Id (PK), Field1 (float), DateField (DateTime) }
TableB { Id (PK), TableAId (FK), TableDId (FK), Field2 (float) }
TableC { Id (PK), TableBId (FK), TableEId (FK), Field3 (float) }
TableD { Id (PK), Type (tinyint) }
TableE { Id (PK), Type (tinyint) }
表B中的一些记录(但不是所有记录)包含表C中的子记录。根据某个日期范围(从到),我需要从TableA中获取所有记录及其相关记录,并计算:

  • 表A.1摘要
  • TableB.Field2汇总,按TableD.Type分组(共有5种不同类型)
  • 表C.Field3的摘要,由TableE.Type(有4种不同的类型)提取
因此,结果应该包含10个计算总结。实现这一目标最有效的方法是什么

编辑:以下是每个摘要的伪查询示例:

SELECT SUM(a.Field1) FROM TableA a INNER JOIN TableB b ON a.Id = b.TableAId WHERE a.DateField BETWEEN DateFrom AND DateTo

SELECT SUM(b.Field2) FROM TableA a INNER JOIN TableB b ON a.Id = TableD d ON b.TableDId=d.Id WHERE a.DateField BETWEEN DateFrom AND DateTo AND d.Type = 1

SELECT SUM(b.Field2) FROM TableA a INNER JOIN TableB b ON a.Id = TableD d ON b.TableDId=d.Id WHERE a.DateField BETWEEN DateFrom AND DateTo AND d.Type = 2 // etc to 5

SELECT SUM(c.Field3) FROM TableA a INNER JOIN TableB b ON a.Id = b.TableAId INNER JOIN TableC c ON b.Id=c.TableBId INNER JOIN TableE ON c.TableEId=e.Id WHERE a.DateField BETWEEN DateFrom AND DateTo AND e.Type = 1 // 3x this query, only type is different

我认为最好的方法是使用CTE在一个查询中编写整个内容,并让SQL Server的优化器找出执行该内容的最佳方法。这样我们就不会:

  • 重复处理多个查询
  • 创建未编制索引的表变量
  • 创建需要写入磁盘的临时表
  • 问题是:

    with a as (select * from tableA where datefield between datefrom and dateto),
    b as ( select * from tableB where tableB.tableAid = a.id)
        select null, sum(a.field1) from a
    union 
        select d.type, sum(b.field2) 
        from b
        join tableD d on d.id = b.tableDid
        group by d.type
    union 
        select e.type, sum(c.field3)
        from tableC c
        join b on b.id = c.tableBid
        join tableE e on e.id = c.tableEid
    

    合计还是其他“汇总”?任何分组?总和聚合,字段2和字段3上都需要分组,如上所述,这两个分组都是每种类型的分组。