同一查询中的SQL Server(使用REPLACE和SUM)
我有10个百分比,5个完成了50%的100%,其余5个完成了0% 我的目标是将0%替换为100%,然后一起计算10个百分比/10 例如:同一查询中的SQL Server(使用REPLACE和SUM),sql,sql-server,tsql,Sql,Sql Server,Tsql,我有10个百分比,5个完成了50%的100%,其余5个完成了0% 我的目标是将0%替换为100%,然后一起计算10个百分比/10 例如: (Original Data) ((0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0)/10) = 0.35 (35%) (What I want) ((0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 1 + 1 + 1 + 1 + 1)/10) = 0.75 (75%) 这
(Original Data) ((0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0)/10) = 0.35 (35%)
(What I want) ((0.5 + 0.5 + 0.5 + 0.5 + 0.5 + 1 + 1 + 1 + 1 + 1)/10) = 0.75 (75%)
这是如何在SQL Server中实现的?我尝试过null如果和ISNULL
但是我知道这些都是错误的,我不知道如何在SUM中使用REPLACE
语句
PS。。。我不想实际替换表中的数据,这是为了查看,谢谢,而且这些数据在一行中的10个不同列中引用
例如:
select FinanceID, SUM(Percentage1 + Percentage2 + Percentage3 + Percentage4
+ Percentage5 + Percentage6 + Percentage7 + Percentage8 + Percentage9
+ Percentage10 )/10 from FinanceTable
where FinanceID = 1
group by FinanceID
此查询选择10个百分比并除以金额,现在我需要将0值替换为100,这可能是所有值都大于0或随机百分比的任何情况,例如百分比7是唯一百分比大于0的情况。为了澄清0%在表中存储为0%,不为NULL,请将其用于所有字段,如我用于percentage1的字段
(isnull(nullif(percentage1,0),1))
对所有字段使用此选项,就像我对percentage1使用的一样
(isnull(nullif(percentage1,0),1))
由于所有这些值都在单独的列中,因此不能使用SUM
<代码>求和
用于跨行而不是跨列求和值
相反,您需要这样做:
SELECT
CASE WHEN Percentage1 = 0 THEN 1 ELSE Percentage1 END
+ CASE WHEN Percentage2 = 0 THEN 1 ELSE Percentage2 END
+ CASE WHEN Percentage3 = 0 THEN 1 ELSE Percentage3 END
+ CASE WHEN Percentage4 = 0 THEN 1 ELSE Percentage4 END
+ ...
SELECT financeId, SUM(CASE WHEN Pct = 0 THEN 1 ELSE Pct END)/10
FROM
(SELECT financeId, percentage1, percentage2, percentage3,...
FROM #temp) p
UNPIVOT
(Pct FOR Name IN (percentage1, percentage2, percentage3,...)
)AS unpvt
group by financeId;
您还可以将表转换为一长串值,然后使用SUM
:
SELECT SUM(P) FROM (
SELECT Percentage1 AS P ...
UNION ALL
SELECT Percentage2 ...
UNION ALL
SELECT Percentage3 ...
...
)
由于所有这些值都在单独的列中,因此不能使用SUM
<代码>求和
用于跨行而不是跨列求和值
相反,您需要这样做:
SELECT
CASE WHEN Percentage1 = 0 THEN 1 ELSE Percentage1 END
+ CASE WHEN Percentage2 = 0 THEN 1 ELSE Percentage2 END
+ CASE WHEN Percentage3 = 0 THEN 1 ELSE Percentage3 END
+ CASE WHEN Percentage4 = 0 THEN 1 ELSE Percentage4 END
+ ...
SELECT financeId, SUM(CASE WHEN Pct = 0 THEN 1 ELSE Pct END)/10
FROM
(SELECT financeId, percentage1, percentage2, percentage3,...
FROM #temp) p
UNPIVOT
(Pct FOR Name IN (percentage1, percentage2, percentage3,...)
)AS unpvt
group by financeId;
您还可以将表转换为一长串值,然后使用SUM
:
SELECT SUM(P) FROM (
SELECT Percentage1 AS P ...
UNION ALL
SELECT Percentage2 ...
UNION ALL
SELECT Percentage3 ...
...
)
这会奏效的
create table #temp (financeId varchar(10),percentage1 decimal(6,2),percentage2 decimal(6,2),percentage3 decimal (6,2))
go
insert into #temp values ('ROW1',0.5,0,.75)
insert into #temp values ('ROW2',0.25,0.75,0)
insert into #temp values ('ROW3',0.4,0,.85)
go
select
sum(
case isnull(percentage1,0) when 0 then 1 else percentage1 end +
case isnull(percentage2,0) when 0 then 1 else percentage2 end +
case isnull(percentage3,0) when 0 then 1 else percentage3 end
) / 3
from #temp
group by financeID
这会奏效的
create table #temp (financeId varchar(10),percentage1 decimal(6,2),percentage2 decimal(6,2),percentage3 decimal (6,2))
go
insert into #temp values ('ROW1',0.5,0,.75)
insert into #temp values ('ROW2',0.25,0.75,0)
insert into #temp values ('ROW3',0.4,0,.85)
go
select
sum(
case isnull(percentage1,0) when 0 then 1 else percentage1 end +
case isnull(percentage2,0) when 0 then 1 else percentage2 end +
case isnull(percentage3,0) when 0 then 1 else percentage3 end
) / 3
from #temp
group by financeID
您可以使用
CASE
语句转换每个值,但使用UNPIVOT
将百分比列转换为以下行更为清晰:
SELECT
CASE WHEN Percentage1 = 0 THEN 1 ELSE Percentage1 END
+ CASE WHEN Percentage2 = 0 THEN 1 ELSE Percentage2 END
+ CASE WHEN Percentage3 = 0 THEN 1 ELSE Percentage3 END
+ CASE WHEN Percentage4 = 0 THEN 1 ELSE Percentage4 END
+ ...
SELECT financeId, SUM(CASE WHEN Pct = 0 THEN 1 ELSE Pct END)/10
FROM
(SELECT financeId, percentage1, percentage2, percentage3,...
FROM #temp) p
UNPIVOT
(Pct FOR Name IN (percentage1, percentage2, percentage3,...)
)AS unpvt
group by financeId;
这样可以避免重复每个字段的
CASE
语句您可以使用CASE
语句转换每个值,但使用UNPIVOT
将百分比列转换为以下行更为清晰:
SELECT
CASE WHEN Percentage1 = 0 THEN 1 ELSE Percentage1 END
+ CASE WHEN Percentage2 = 0 THEN 1 ELSE Percentage2 END
+ CASE WHEN Percentage3 = 0 THEN 1 ELSE Percentage3 END
+ CASE WHEN Percentage4 = 0 THEN 1 ELSE Percentage4 END
+ ...
SELECT financeId, SUM(CASE WHEN Pct = 0 THEN 1 ELSE Pct END)/10
FROM
(SELECT financeId, percentage1, percentage2, percentage3,...
FROM #temp) p
UNPIVOT
(Pct FOR Name IN (percentage1, percentage2, percentage3,...)
)AS unpvt
group by financeId;
这样可以避免重复每个字段的
案例
语句您能更清楚地阐述吗..您能发布实际的查询吗?改进覆盖所有场景的示例数据“10个百分比”是表中的10列?是的,10个百分比都是一行内的列,在这种场景中,1-给出的输出为0.65,不是0.75你能更清楚地阐述一下吗..你能发布实际的查询吗?改进你的样本数据,涵盖所有场景。因此“10个百分比”是表中的10列?是的,10个百分比都是一行内的列,在这种情况下,1-给出的输出为0.65,不是0.75没有理由引入空值当你可以用case检查值时我用try得到值15.35将'100'更改为'1'因为你需要替换为'1'没有理由引入空值当你可以用case检查值时我用try得到值15.35将'100'更改为'1'因为你需要替换为'1'没有看到这一点直到我提交回复后才看到附加评论。直到我提交回复后才看到附加评论。