3

部品番号ごとに、それらの部品のテスト結果を合格数と不合格数、および合格率と不合格率で示すレポートを作成しようとしています。

これまでのところ、私は次のものを持っています:

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:

CREATE TABLE RESULTS (
    [ResultID] [int] NOT NULL,
    [SerialNo] [int] NOT NULL,
    [PartNo] [varchar](10) NOT NULL,
    [Result] [varchar](10) NOT NULL);

DML:

INSERT INTO Results VALUES (1, '100', 'ABC', 'Pass')
INSERT INTO Results VALUES (2, '101', 'DEF', 'Pass')
INSERT INTO Results VALUES (3, '100', 'ABC', 'Fail')
INSERT INTO Results VALUES (4, '102', 'DEF', 'Pass')
INSERT INTO Results VALUES (5, '102', 'DEF', 'Pass')
INSERT INTO Results VALUES (6, '102', 'DEF', 'Fail')
INSERT INTO Results VALUES (7, '101', 'DEF', 'Fail')

アップデート:

bluefeetの答えに基づく私の解決策は次のとおりです。

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

FLOAT を ROUND しました (CAST から DECIMAL を 2 回実行するのではなく)。その方が少し効率的です。

4

1 に答える 1

4

Percent Passed と Percent Failed の列を追加するだけでよいようです。でこれらの列を計算できますPIVOT

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
于 2012-06-20T14:31:01.967 に答える