Tsql 分隔行中的平均结果

Tsql 分隔行中的平均结果,tsql,Tsql,是否有可能获得一个额外的行,其中包含单个列的平均结果 例如: 我唯一能想到的是这样的事情: with mainCte as ( SELECT DetailID, Quantity, Value FROM dbo.Detail ), rowCte as ( SELECT sumQuantity = sum(Quantity), avgValue = avg(Value) FR

是否有可能获得一个额外的行,其中包含单个列的平均结果

例如:


我唯一能想到的是这样的事情:

with mainCte as (
    SELECT 
        DetailID, Quantity, Value      
    FROM 
        dbo.Detail
),
rowCte as (
    SELECT 
        sumQuantity = sum(Quantity), 
        avgValue = avg(Value)    
    FROM 
        dbo.Detail 
)
select 
    DetailID,
    Quantity,
    Value 
from 
    mainCte

union

select
    DetailID = null,
    Quantity = sumQuantity,
    Value = avgValue
from
    rowCte

有两种解决办法

1)
使用rollup
-rollup将执行通常的group by,再加上向上滚动到其上可能的每个级别。虽然这是一个很好的解决方案,但我相信微软已经说过它很快就会被弃用

2)
分组集
-这是一个新的汇总解决方案,您可以指定它汇总的每个级别,其中包括一组
()
将汇总到可能的最高级别

我个人更喜欢选项2,所以我在回答中使用了这个选项

请参阅下面我的解决方案:

create table ##tmp_tbl_main
    (
        customer int not null
        , recv_weight decimal(10,2) not null
        , rej_weight decimal(10,2) not null
    )

insert into ##tmp_tbl_main values (1,100.00,5.00)
insert into ##tmp_tbl_main values (2,120.00,4.00)
insert into ##tmp_tbl_main values (3,230.00,20.00)
insert into ##tmp_tbl_main values (4,120.00,10.00)
insert into ##tmp_tbl_main values (5,50.00,3.00)


select coalesce(cast(a.customer as varchar(10)), 'Total') as Customer
, sum(a.recv_weight) as [Received Weight]
, format(avg(a.rej_weight), '0.00') as [Rejected Weight]
, format(case when a.customer is NULL or sum(a.recv_weight) = 0 then NULL --protecting against div/0 error
       else sum(a.rej_weight)/sum(a.recv_weight)
  end, '0.00%') as [% Rejected]
from ##tmp_tbl_main as a
group by grouping sets
    (
        (a.customer)
        , ()
    )
结果:

create table ##tmp_tbl_main
    (
        customer int not null
        , recv_weight decimal(10,2) not null
        , rej_weight decimal(10,2) not null
    )

insert into ##tmp_tbl_main values (1,100.00,5.00)
insert into ##tmp_tbl_main values (2,120.00,4.00)
insert into ##tmp_tbl_main values (3,230.00,20.00)
insert into ##tmp_tbl_main values (4,120.00,10.00)
insert into ##tmp_tbl_main values (5,50.00,3.00)


select coalesce(cast(a.customer as varchar(10)), 'Total') as Customer
, sum(a.recv_weight) as [Received Weight]
, format(avg(a.rej_weight), '0.00') as [Rejected Weight]
, format(case when a.customer is NULL or sum(a.recv_weight) = 0 then NULL --protecting against div/0 error
       else sum(a.rej_weight)/sum(a.recv_weight)
  end, '0.00%') as [% Rejected]
from ##tmp_tbl_main as a
group by grouping sets
    (
        (a.customer)
        , ()
    )

如果你问是否可以使用计算机进行数学计算。。。是的,是的,这是可能的。你试过了吗?你被卡在哪里了?很抱歉我没说清楚。这个问题是关于一个问题TSQL@JorgeLopes如果您使用了下面任何人提供的答案,人们通常通过单击复选标记来“接受”答案。(让你知道,因为这似乎是你的第一篇帖子)