在查询的最后一行显示总计

问题描述 投票:0回答:2

我想显示最后2列的总数,但无法接缝以获得正确的代码。这是代码。

 declare @FromDate as datetime
 declare @ToDate as datetime
 set @FromDate='1/1/2018'
 set @ToDate='1/31/2018'

Select
 OrderMain.OrderNumber,
 OrderMain.OrderDate,       
 OrderMain.TotalMiles,
 OFAddStop.FeeValue AS NumberStops

From 
 Ordermain with (readuncommitted)
 Left Outer Join Customer with (readuncommitted) on Ordermain.CustomerID=Customer.CustomerID
 Left outer join OrderFee OFAddStop with (readuncommitted) on OFAddStop.OrderID=OrderMain.OrderID 
   and OFAddStop.Sequence=9 and OFAddStop.SubSequence=6

Where
 Customer.CustomerCode IN('36716')
 and OrderMain.OrderDate >=@FromDate
 and OrderMain.OrderDate <=@ToDate
 and OrderMain.OrderStatus in ('N','A','I','P')

以下是Query的示例

 OrderNumber   OrderDate    TotalMiles NumberStops 
  10747511     01/02/18        280        6 
  10750287     01/03/18        118        4 

最后一行应如下所示

 OrderNumber   OrderDate    TotalMiles NumberStops 
  10747511     01/02/18        280        6 
  10750287     01/03/18        118        4    
 Total                         398        10

有人能告诉我正确的方法来实现这一目标吗?

sql sql-server
2个回答
1
投票

在SQL Server中,您可以使用GROUPING SETS执行此操作,但需要聚合查询:

Select om.OrderNumber, om.OrderDate,
       SUM(om.TotalMiles) as TotalMiles,
       SUM(oaf.FeeValue) as NumberStops
From Ordermain om Join
     Customer c
     on om.CustomerID = c.CustomerID Left outer join
     OrderFee oaf
     on oaf.OrderID = om.OrderID and
        oaf.Sequence = 9 and oaf.SubSequence = 6
Where c.CustomerCode in ('36716') and
      om.OrderDate >= @FromDate
      om.OrderDate <= @ToDate and
      om.OrderStatus in ('P', 'A', 'I', 'N')  -- couldn't resist
group by grouping sets ( (om.OrderNumber, om.OrderDate), () );

笔记:

  • 表别名使查询更易于编写和读取。
  • 聚合位于前两列。我认为那些没有重复。
  • 您正在寻找一个特定的客户,因此该表的join应该是常规的join

1
投票

如果db接受With子句。

 declare @FromDate as datetime
 declare @ToDate as datetime
 set @FromDate='1/1/2018'
 set @ToDate='1/31/2018'

 With
 records as (
   Select
     cast(OrderMain.OrderNumber as varchar(32)) OrderNumber,
     OrderMain.OrderDate,       
     OrderMain.TotalMiles,
     OFAddStop.FeeValue AS NumberStops
   From 
     Ordermain with (readuncommitted)
     Left Outer Join Customer with (readuncommitted) on 
       Ordermain.CustomerID=Customer.CustomerID
     Left outer join OrderFee OFAddStop with (readuncommitted) on 
       OFAddStop.OrderID=OrderMain.OrderID 
       and OFAddStop.Sequence=9 and OFAddStop.SubSequence=6
    Where
      Customer.CustomerCode IN('36716')
      and OrderMain.OrderDate >=@FromDate
      and OrderMain.OrderDate <=@ToDate
      and OrderMain.OrderStatus in ('N','A','I','P')
  )
  Select
     OrderNumber,
     OrderDate,
     TotalMiles,
     NumberStops
  From
     records
  Union All
  Select
    'Total',
    null,
    sum(TotalMiles),
    sum(NumberStops)
  From
     records
© www.soinside.com 2019 - 2024. All rights reserved.