2016-11-10 92 views
0

我有一个下表计数率并把它添加到一个新的列

[Table_OrangeIsNewBlack] 
ID | Name | Color | RedPercent 
------------------------------------------ 
1 | Donald | Orange | 
2 | Hillary | White | 
3 | Barack | Black | 
4 | Bernie | Grey | 
1 | Donald | Red  | 
2 | Hillary | Red  | 
3 | Barack | Black | 
4 | Bernie | Grey | 
1 | Donald | Red  | 
2 | Hillary | Blue | 
3 | Barack | Red  | 
4 | Bernie | Purple | 

我需要增加一个百分比值呈现人怎么往往是“红”


Donald的记录

1  Donald  Orange  
1  Donald  Red   
1  Donald  Red   

RedPercent:(2/3)×100 = 66,66


希拉里

2  Hillary  White  
2  Hillary  Red   
2  Hillary  Blue   

'蓝色' 和 '紫色' 不计,从而:

RedPercent:(1/2)* 100 = 50,00


Barack

3  Barack  Black  
3  Barack  Black  
3  Barack  Red 

RedPercent:(1/3)×100 = 33,33


伯尼

4  Bernie  Grey   
4  Bernie  Blue   
4  Bernie  Purple  

'蓝色' 和 '紫色' 不计

RedPercent:(0/1) * 100 = 00,00

结果所需要的:

[Table_OrangeIsNewBlack] 
ID | Name | Color | RedPercent 
------------------------------------------ 
1 | Donald | Orange | 66,66 
2 | Hillary | White | 50,00 
3 | Barack | Black | 33,33 
4 | Bernie | Grey | 00,00 
1 | Donald | Red  | 66,66 
2 | Hillary | Red  | 50,00 
3 | Barack | Black | 33,33 
4 | Bernie | Grey | 00,00 
1 | Donald | Red  | 66,66 
2 | Hillary | Blue | 50,00 
3 | Barack | Red  | 33,33 
4 | Bernie | Purple | 00,00 

我已经试过:

;WITH CTE AS 
    (
     SELECT ID, 
        -- Division: count of Reds/count of persons all rows 
        ((SELECT COUNT(ID) FROM Table_OrangeIsNewBlack 
        WHERE Color = 'Red') 
        /  
        (SELECT COUNT(ID) FROM Table_OrangeIsNewBlack 
        WHERE (Color <> 'Blue' and 
          Color <> 'Purple')) 
        ) 
        AS redprcnt 
       -- end of Division 
     FROM Table_OrangeIsNewBlack 
    ) 
    UPDATE T1 
     SET RedPercent = CTE.redprcnt 
     FROM Table_OrangeIsNewBlack T1 
    INNER JOIN CTE ON(T1.ID = CTE.ID) 

SELECT子句...

SELECT ID, 
      -- Division: count of Reds/count of persons all rows 
      ((SELECT COUNT(ID) FROM Table_OrangeIsNewBlack 
      WHERE Color = 'Red') 
      /  
      (SELECT COUNT(ID) FROM Table_OrangeIsNewBlack 
      WHERE (Color <> 'Blue' and 
        Color <> 'Purple')) 
      ) 
      AS redprcnt 
     -- end of Division 
FROM Table_OrangeIsNewBlack 

...只给出了redprcnt零

我应该用GROUP BY在某些时候?

有什么建议吗?

在此先感谢。

回答

1

COUNT通常会产生一个INTEGER,因此COUNT/COUNT是一个整数除法,它会截断并且您的基本查询会尝试计算总体百分比而不是每个组的百分比。

SELECT ID, 
     -- Division: count of Reds/count of persons all rows 
    100.00 * COUNT(CASE WHEN Color = 'Red' THEN ID END) 
     /NULLIF(COUNT(CASE WHEN Color <> 'Blue' and Color <> 'Purple' THEN ID END), 0) AS redprcnt 
FROM Table_OrangeIsNewBlack 
GROUP BY ID 

CASE返回NULL对于未被计数不匹配行:

另外你的计算可使用条件聚合被简化。

编辑:

如果你确实需要重复的每一行,你可以切换到窗总结而不是百分比:

SELECT ID, Name, Color, 
    100.00 * Count(CASE WHEN Color = 'Red' THEN ID END) Over(PARTITION BY NAME) 
     /NULLIF(Count(CASE WHEN Color <> 'Blue' AND Color <> 'Purple' THEN ID END) Over(PARTITION BY NAME), 0) AS redprcnt 
FROM Table_OrangeIsNewBlack 
+0

除以零遇到的错误。 警告:空值由集合或其他SET操作消除。如何避免被0除? – Kaptah

+0

'NULLIF'需要2个参数。做了一个更正:'THEN ID END),0)AS redprcnt' – Kaptah

+0

@Kaptah:当然,再次抱歉,修复了我的答案。 – dnoeth

1

有趣的任务,我做了脚本,可以帮助您

;WITH CTE AS 
(
    SELECT * ,COUNT(CASE WHEN Color = 'Red' THEN ID END) OVER(Partition by Name,Color) ColorCount, 
      COUNT(CASE WHEN Color <> 'Blue' and Color <> 'Purple' THEN ID END) OVER(Partition by Name)TotalCount 
    FROM TableName 
) 
SELECT ID,Name, (SELECT MAX(((ColorCount*1.0)/(CASE WHEN TotalCount = 0 THEN 1 ELSE TotalCount END))*100) 
       FROM CTE InnerCte 
       WHERE OuterCTE.ID=InnerCte.ID AND OuterCTE.Name=InnerCte.Name) 
FROM CTE OuterCTE 
+0

除以零遇到的错误。警告:空值由集合或其他SET操作消除。如何避免被0除? – Kaptah

+0

COUNT OVER如果我们使用简单COUNT来抑制GROUP BY的功能,那么我们需要它到GROUP BY ID和Name,并且这将不会产生结果什么操作正在寻找 –

+0

编辑'SELECT ID,Name,(SELECT MAX((COALESCE (ColorCount * 1.0)/ NULLIF(ColorCount,0),0)* 100))' – Kaptah

相关问题