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如果您使用了下面任何人提供的答案,人们通常通过单击复选标记来“接受”答案。(让你知道,因为这似乎是你的第一篇帖子)