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