我有10个百分点,5个完成50%我们100%,其余5个0%100%
我的目标是将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%)
这是如何在SQL Server中实现的?我尝试了NULLIF
和ISNULL
,但我知道这些不正确,我不知道如何在SUM中使用REPLACE
语句
PS ...我不想实际替换表中的数据,它是为了视图的目的,谢谢你,而且这些数据在1行内的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
答案 0 :(得分:2)
由于所有这些值都在各列中,因此无法使用SUM
。 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
+ ...
您还可以将表格转换为一长串值,然后使用SUM
:
SELECT SUM(P) FROM (
SELECT Percentage1 AS P ...
UNION ALL
SELECT Percentage2 ...
UNION ALL
SELECT Percentage3 ...
...
)
答案 1 :(得分:1)
这将有效
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
答案 2 :(得分:0)
将此用于所有字段,例如我用于percentage1
(isnull(nullif(percentage1,0),1))
答案 3 :(得分:0)
您可以使用CASE
语句转换每个值,但使用UNPIVOT
将百分比列转换为这样的行会更清楚:
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
语句