Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一查询中的SQL Server(使用REPLACE和SUM)_Sql_Sql Server_Tsql - Fatal编程技术网

同一查询中的SQL Server(使用REPLACE和SUM)

同一查询中的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%) 这

我有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%)
这是如何在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'没有看到这一点直到我提交回复后才看到附加评论。直到我提交回复后才看到附加评论。