Tsql SQL:数据透视计数&;对列的百分比

Tsql SQL:数据透视计数&;对列的百分比,tsql,sql-server-2008-r2,pivot,aggregate,Tsql,Sql Server 2008 R2,Pivot,Aggregate,我正试图制作一份报告,显示每个零件号的测试结果,包括通过和失败的数字,以及通过和失败的百分比 到目前为止,我有以下几点: SELECT r2.PartNo, [Pass] AS Passed, [Fail] as Failed FROM (SELECT ResultID, PartNo, Result FROM Results) r1 PIVOT (Count(ResultID) FOR Result IN ([Pass], [Fail])) AS r2 ORDER By r2.

我正试图制作一份报告,显示每个零件号的测试结果,包括通过和失败的数字,以及通过和失败的百分比

到目前为止,我有以下几点:

SELECT r2.PartNo, [Pass] AS Passed, [Fail] as Failed
    FROM
    (SELECT ResultID, PartNo, Result FROM Results) r1
PIVOT (Count(ResultID) FOR Result IN ([Pass], [Fail])) AS r2
ORDER By r2.PartNo
这是解决方案的一半(通过和失败的总数);问题是,我如何推进并包括百分比

我还没有尝试过,但我想我可以从头开始,建立一系列子查询,但这更像是一个学习练习——我想知道“最好”(最优雅或最有效)的解决方案,所以我想寻求建议

我可以扩展这个PIVOT查询,还是应该采用不同的方法

DDL:

DML:

更新:

我的解决方案基于BlueFoot的答案是:

SELECT r2.PartNo, 
    [Pass] AS Passed, 
    [Fail] as Failed,
    ROUND(([Fail] / CAST(([Pass] + [Fail]) AS REAL)) * 100, 2) AS PercentFailed
    FROM
    (SELECT ResultID, PartNo, Result FROM Results) r1
PIVOT (Count(ResultID) FOR Result IN ([Pass], [Fail])) AS r2
ORDER By r2.PartNo

我已经四舍五入了一个浮点(而不是两次转换为十进制),因为它的效率稍微高一点,而且我还决定我们只需要失败%age。

听起来你只需要为通过百分比和失败百分比添加一列。您可以在
透视图上计算这些列

SELECT r2.PartNo
    , [Pass] AS Passed
    , [Fail] as Failed
    , ([Pass] / Cast(([Pass] + [Fail]) as decimal(5, 2))) * 100 as PercentPassed
    , ([Fail] / Cast(([Pass] + [Fail]) as decimal(5, 2))) * 100 as PercentFailed
FROM
(
    SELECT ResultID, PartNo, Result 
    FROM Results
) r1
PIVOT 
(
    Count(ResultID) 
    FOR Result IN ([Pass], [Fail])
) AS r2
ORDER By r2.PartNo

实际上我也试过类似的方法,但很明显,我在这一过程中迷失了方向。但是这个解决方案非常有效——谢谢。
SELECT r2.PartNo, 
    [Pass] AS Passed, 
    [Fail] as Failed,
    ROUND(([Fail] / CAST(([Pass] + [Fail]) AS REAL)) * 100, 2) AS PercentFailed
    FROM
    (SELECT ResultID, PartNo, Result FROM Results) r1
PIVOT (Count(ResultID) FOR Result IN ([Pass], [Fail])) AS r2
ORDER By r2.PartNo
SELECT r2.PartNo
    , [Pass] AS Passed
    , [Fail] as Failed
    , ([Pass] / Cast(([Pass] + [Fail]) as decimal(5, 2))) * 100 as PercentPassed
    , ([Fail] / Cast(([Pass] + [Fail]) as decimal(5, 2))) * 100 as PercentFailed
FROM
(
    SELECT ResultID, PartNo, Result 
    FROM Results
) r1
PIVOT 
(
    Count(ResultID) 
    FOR Result IN ([Pass], [Fail])
) AS r2
ORDER By r2.PartNo