显示SQL中的所有列以及最后一个重复行中具有相同ID的列的总和

时间:2017-04-03 17:51:38

标签: sql-server

我有2张桌子

订单明细

Id          Name       type      Quantity  
------------------------------------------
2009        john       a         10        
2009        john       a         20        
2010        sam        b         25            
2011        sam        c         50       
2012        sam        d         30          

ValueDetails

Id          Value
-------------------
2009        300
2010        500
2011        200
2012        100

我需要获得一个显示数据的输出:

Id          Name       type      Quantity  Price
-------------------------------------------------
2009        john       a         10        
2009        john       a         20        9000
2010        sam        b         25            
2011        sam        c         50       
2012        sam        d         30        25500

价格按价值x数量计算,价值总和显示在给定名称的最后一个重复行中。

我厌倦了使用sum和group by但我只得到了两行。我需要显示所有5行。我该如何撰写此查询?

2 个答案:

答案 0 :(得分:0)

SELECT    a.ID,
          a.Name,
          a.Type,
          a.quantity,
          price = (a.quantity * b.price)
FROM      OrderDetails a LEFT JOIN
          ValueDetails b on a.id = b.id

这将把价格放在每一行。如果您想通过ID,名称和类型进行SUM,则不会显示您在上面显示的各个记录。如果你想在一个共享相同的Id,Name和Type的行上放置一个SUM,那么你需要一个规则来确定哪个,然后你可以使用CASE语句来决定你在哪一行想要显示SUM总数。

答案 1 :(得分:0)

您可以使用Row_Number和Row_Number的最大值来获得此格式化的总和

;with cte as (
select od.*, sm= sum( od.Quantity*vd.value ) over (partition by Name),
    RowN = row_number() over(partition by Name order by od.id)
    from #yourOrderDetails od 
    inner join #yourValueDetails vd
        on od.Id = vd.Id
        )
    select Id, Name, Type, Quantity, 
        case when max(RowN) over(partition by Name) = row_number() over(partition by Name order by Id) 
        then sm else null end as ActualSum 
        from cte

您的输入表格:

create table #yourOrderDetails (Id int, Name varchar(20), type varchar(2), Quantity int)
insert into #yourOrderDetails (Id, Name, type, Quantity) values
 (2009  ,'john','a',  10 )       
,(2009  ,'john','a',  20 )      ,(2010  ,'sam ','b',  25 )        
,(2011  ,'sam ','c',  50 )      ,(2012  ,'sam ','d',  30 )  

create table #yourValueDetails(Id int, Value Int)
insert into #yourValueDetails(Id, value) values 
 (  2009    ,    300   )    ,(  2010    ,    500   )
,(  2011    ,    200   )    ,(  2012    ,    100   )