我有一个用于员工评估记录的表
- 负&正(分别表示为" -3,-2"中的整数值)。
- 否&是(在表" -1,0"中表示为整数值)。
- 值从1到5(表示为具有相同值的整数)。
所以这是表设计的一个示例:
--------------------
| evaID | int |
--------------------
| employeeID | int |
--------------------
| evaRec | int |
--------------------
这是表数据的示例:
-------------------------------
| evaID | employeeID | evaRec |
-------------------------------
| 1 | 00001 | -3 |
-------------------------------
| 17 | 00001 | -2 |
-------------------------------
| 19 | 00001 | -2 |
-------------------------------
| 19 | 00001 | -1 |
-------------------------------
| 16 | 00002 | 3 |
-------------------------------
| 16 | 00005 | 0 |
-------------------------------
现在,我想要的是根据类型选择特定员工的所有记录的总和作为评估的百分比,但分开了3种类型(例如Ex (与该表数据无关)):
- 否定类型:20%/80%
- 否&是类型:30%/70%
- 1,2,3,4或5类型:10%/50%/5%/15%/20%
因此,基本上我希望Select语句返回6个float值表示所有先前提到类型的百分比为(floatnegative,floatno,float1,float1,float2 float3和float4),如果可能的话 - ,但我知道这很难,因为我无法弄清楚其背后的逻辑 - 我希望它返回第7浮标值代表所有人的百分比,例如不好的评估,但我还不知道如何混合"是或否"是2个因子百分比," 1,2,3,4或5"是5个因子百分比!
所以稍后在我的C#代码中,我将使用:
之类的选择结果- floatNegative = 20(负= 20%,正= 100-浮力= 80%)
- floattno = 30(否= 30%,是= 100-floatno = 70%)
- 其他5个数字...
这意味着我根据上述评估类型有3个单独的百分比计算。
所以最后,如果我从上表中通过雇员" 00001"运行查询,我会得到重新打击:
- floatnegation = 33.3
- floatPosive = 66.6
- floatno = 100.0
因为他有1 x "负"记录(-3)和2 x "正面"记录(-2),总共有3个记录。(在"负/正/正"类型的评估组上),他也有1 x " no"记录(-1),但没有任何>"是的"记录(0)这就是为什么结果为"否"( on" no/yes"类型的评估组)的结果。而且,如果他没有任何记录(例如1,2,3,4,5),我不在乎其他类型的结果,这可能是负浮点值,因此我可以在我的C#代码上进行区分以弄清楚它他还没有这种类型的记录,并且在我的ASP.NET最终标记上隐藏了百分比指示器文本。
我认为您正在寻找有条件的聚合。逻辑是GROUP BY employeeID
,然后使用各种SUM(CASE ...)
ePressions计算中间总和。
说您想计算员工的负面评估 theu n:
SUM(CASE WHEN evaRec = -2 THEN 1 ELSE 0 END)
您还计算了总的正面和负面反馈:
SUM(CASE WHEN evaRec IN (-2, -3) THEN 1 ELSE 0 END)
这是使用该原理的完整查询。对于二进制评估类型(正/负,是/否),仅计算两个值之一(另一个仅是1 - <this_value>
)。对于1/2/3/4/5类型,每个比例都是单独计算的。
SELECT
employeeID,
1.0 * SUM(CASE WHEN evaRec = -2 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (-2, -3) THEN 1 ELSE 0 END), 0) PercentPositive,
1.0 * SUM(CASE WHEN evaRec = 0 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (-1, 0) THEN 1 ELSE 0 END), 0) PercentYes,
1.0 * SUM(CASE WHEN evaRec = 1 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5) THEN 1 ELSE 0 END), 0) PercentValue1,
1.0 * SUM(CASE WHEN evaRec = 2 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5) THEN 1 ELSE 0 END), 0) PercentValue2,
1.0 * SUM(CASE WHEN evaRec = 3 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5) THEN 1 ELSE 0 END), 0) PercentValue3,
1.0 * SUM(CASE WHEN evaRec = 4 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5) THEN 1 ELSE 0 END), 0) PercentValue4,
1.0 * SUM(CASE WHEN evaRec = 5 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5) THEN 1 ELSE 0 END), 0) PercentValue5
FROM t
GROUP BY employeeID
nb:需要特别注意避免通过0。
此 db小提琴带有示例数据返回:
员工|百分比|百分点|百分比value1 |百分比value2 |百分比value3 |百分比4 |百分比5----------:|:----------------- |:--------------- |:--------------- |:--------------- |:--------------- |:--------------- |:----------------------- 1 |0.666666666666 |0.000000000000 | null | null | null | null | null 2 | null | null |0.000000000000 |0.000000000000 |1.000000000000 |0.000000000000 |0.000000000000 5 | null |1.000000000000 | null | null | null | null | null