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

时间:2014-10-09 10:10:57

标签: sql sql-server tsql

我有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中实现的?我尝试了NULLIFISNULL,但我知道这些不正确,我不知道如何在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

4 个答案:

答案 0 :(得分:2)

由于所有这些值都在各列中,因此无法使用SUMSUM用于对行进行求和,而不是跨列。

相反,你需要做这样的事情:

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语句

相关问题