【问题标题】:sum clause method calculating the total with alias name?sum 子句方法用别名计算总数?
【发布时间】:2014-01-03 15:04:26
【问题描述】:
ALTER PROCEDURE [dbo].[K_FS_GetFeedDivisionReport] 
@orderno varchar(50)
AS
BEGIN

SET NOCOUNT ON;
select OT.OrderNo,FT.Feedtype,ModeofPack='Plastic',BG.Bagtype,OD.Numofbags,   
(OD.numofbags*BG.Bagtype) as TotalQty,sum(TotalQty) as Total from  
K_FS_OrderconfirmDetails OD
inner join K_FS_bagtype BG on OD.bagtype=BG.sno
inner join k_FPS_FeedType FT  on FT.sno=OD.feedtype
inner join K_FS_OrderDetails OT on OT.sno = OD.orderno where OD.orderno = @orderno
group by  OT.OrderNo,FT.Feedtype,BG.Bagtype,OD.Numofbags
END

这里我计算TotalQty,我想计算TotalQty的总和但是TotalQty是一个别名 有可能吗?否则我该如何解决..请帮助我...

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您可以使用子查询来实现这一点。 以这种方式修改您的选择语句:

      select OT.OrderNo,FT.Feedtype,ModeofPack='Plastic',BG.Bagtype,OD.Numofbags,   
           (OD.numofbags*BG.Bagtype) as TotalQty,
           (select SUM(OD.numofbags*BG.Bagtype) 
            from K_FS_OrderconfirmDetails OD inner join
            K_FS_bagtype BG on OD.bagtype=BG.sno ) 
            as Total
      from K_FS_OrderconfirmDetails OD
            inner join K_FS_bagtype BG on OD.bagtype=BG.sno
            inner join k_FPS_FeedType FT  on FT.sno=OD.feedtype
            inner join K_FS_OrderDetails OT on OT.sno = OD.orderno where OD.orderno = @orderno
      group by  OT.OrderNo,FT.Feedtype,BG.Bagtype,OD.Numofbags 
    

    这将计算最后一列中所有内容的总数。

    【讨论】:

      【解决方案2】:

      是的,你可以这样做:

      ALTER PROCEDURE [dbo].[K_FS_GetFeedDivisionReport] 
      @orderno varchar(50)
      AS
      BEGIN
      
      SET NOCOUNT ON;
      select OT.OrderNo,FT.Feedtype,ModeofPack='Plastic',BG.Bagtype,OD.Numofbags,   
      (OD.numofbags*BG.Bagtype) as TotalQty,sum(OD.numofbags*BG.Bagtype) as Total from  
      K_FS_OrderconfirmDetails OD
      inner join K_FS_bagtype BG on OD.bagtype=BG.sno
      inner join k_FPS_FeedType FT  on FT.sno=OD.feedtype
      inner join K_FS_OrderDetails OT on OT.sno = OD.orderno where OD.orderno = @orderno
      group by  OT.OrderNo,FT.Feedtype,BG.Bagtype,OD.Numofbags,OD.numofbags*BG.Bagtype
      END
      

      如果每行都需要 totalQty,则应使用子查询:

      ALTER PROCEDURE [dbo].[K_FS_GetFeedDivisionReport] 
          @orderno varchar(50)
          AS
          BEGIN
      
          SET NOCOUNT ON;
          select OT.OrderNo,FT.Feedtype,ModeofPack='Plastic',BG.Bagtype,OD.Numofbags,   
          (OD.numofbags*BG.Bagtype) as TotalQty,
          Total = (Select Sum (OD.numofbags*BG.Bagtype) from  K_FS_OrderconfirmDetails OD
          inner join K_FS_bagtype BG on OD.bagtype=BG.sno
          inner join k_FPS_FeedType FT  on FT.sno=OD.feedtype
          inner join K_FS_OrderDetails OT on OT.sno = OD.orderno where OD.orderno = @orderno)
      
       from  
          K_FS_OrderconfirmDetails OD
          inner join K_FS_bagtype BG on OD.bagtype=BG.sno
          inner join k_FPS_FeedType FT  on FT.sno=OD.feedtype
          inner join K_FS_OrderDetails OT on OT.sno = OD.orderno where OD.orderno = @orderno
          group by  OT.OrderNo,FT.Feedtype,BG.Bagtype,OD.Numofbags,OD.numofbags*BG.Bagtype
          END
      

      【讨论】:

      • 什么意思?你想要查询字符串,还是结果?因为结果是一样的sum(OD.numofbags*BG.Bagtype) = sum(TotalQty)
      • 我编辑了我的回复并给了你另一个解决方案,希望它适合你的目的。
      • 是的,但我想计算“TotalQty”列的总和..我的意思是 Totalqty 的所有行
      • 哦,我知道了,你需要一个子查询,比如TotalQty = (select SUM(OD.numofbags*BG.Bagtype) from K_FS_OrderconfirmDetails OD inner join K_FS_bagtype BG on OD.bagtype=BG.sno inner join k_FPS_FeedType FT on FT.sno=OD.feedtype inner join K_FS_OrderDetails OT on OT.sno = OD.orderno where OD.orderno = @orderno)
      • 你是对的,但我保留它们以防它们可能更改主查询中的记录号。因为所有连接都是内部连接。从技术上讲,它们不应该,但以防万一我不知道结构。
      【解决方案3】:

      你不能这样做: SUM(OD.numofbags*BG.Bagtype) 作为 TotalQty,sum(TotalQty) 作为 Total

      【讨论】:

      • 我看到你已经按 OD.numofbagsBG.Bagtype 分组,所以总和不会有任何影响。是否要对集合中的所有行求和 (OD.numofbagsBG.Bagtype)?
      • 您可以通过删除分组到一个变量的分组来为所有行分配 OD.numofbags*BG.Bagtype 的总和,并在存储过程的最终选择中返回具有别名的变量。
      【解决方案4】:

      如果您想要这些总数,您需要在 numofbags 等上删除分组,当您开始对您计算的值进行分组时,您不再进行完整的总和。

      【讨论】:

        猜你喜欢
        • 2018-10-10
        • 2022-11-15
        • 2019-02-04
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        相关资源
        最近更新 更多