2017-01-03 7 views
1

カラムCMDNAME、TIME、およびFAILEDのテーブルがあります。同じCMDNAME値を持つ行がいくつかあります。 TIME列は、トランザクションの単なるタイムスタンプです。 FAILED列は、「Y」または「N」のいずれかです。カラムが特定の値と等しいグループ内のローをカウントするSQL

CMDNAMEの各別個の値に対して、FAILED = 'Y'の行の割合(同じCMDNAME値の場合)の合計行数になるようにします。

私は一種の近くに、以下で入手することができます

select CMDNAME, FAILED, count(*) groupCount from TABLE group by CMDNAME, FAILED 

「N」で1カウントと「Y」カウントが1、私はそれぞれの固有のcmdNameという値のための2つの行を与えること。より直接的に計算する方法がわからない場合は、中間計算を使用してこれを使用することができます。

答えて

0

これを行う1つの方法は、countウィンドウ機能を使用することです。

select distinct CMDNAME, 
1.0*count(case when failed = 'Y' then 1 end) over(partition by CMDNAME) 
/count(*) over(partition by CMDNAME) as groupCount 
from TABLE 

または条件付き集計を使用します。

select CMDNAME, 
1.0*count(case when failed = 'Y' then 1 end)/count(*) as groupCount 
from TABLE 
group by CMDNAME 
+0

どちらの答えは罰金です:あなたは、このプロパティを使用してのみfailed='Y'行をレポートcase式を数えることができます。 :)私のための主要な理解は "カウント(ケース...)"表記でした。 –

+0

最初のバージョンは2番目のバージョンと比較して非常に非効率的です(なぜ、入力行ごとに1行の出力を作成し、結果にselect ** distinct **を使用するのですか?どちらの場合も、1.0 *は不要です。残念ながら、Oracleは整数算術を「知っていません」ので、浮動小数点計算を探している必要はありません。これらはOracleだけのものです。 – mathguy

2

count、多くの集計関数と同様に、null Sをスキップします。あなたは1分以前に得た、

SELECT cmdname, 
     COUNT(*) AS all_rows 
     COUNT(CASE failed WHEN 'Y' THEN 1 END) AS only_failures, 
     COUNT(CASE failed WHEN 'Y' THEN 1 END)/COUNT(*) AS failure_ratio 
FROM  mytbale 
GROUP BY cmdname 
関連する問題