2012-02-14 9 views
1

SQL Server 2005を使用しています。SQL - この簡単なクエリを簡略化するにはどうすればよいですか?

このクエリをどのようにリファクタリングすることができますか?

SELECT Total, Installs, Service, tot.ls_chg_dte_ojb 
    FROM (SELECT COUNT(*) [Total], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     GROUP BY ls_chg_dte_ojb) tot 

    JOIN (SELECT COUNT(*) [Service], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     WHERE job_class_ojb = 'S' 
     GROUP BY ls_chg_dte_ojb) svc on svc.ls_chg_dte_ojb = tot.ls_chg_dte_ojb 

    JOIN (SELECT COUNT(*) [Installs], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     WHERE job_class_ojb in ('C', 'R') 
     GROUP BY ls_chg_dte_ojb) ins on ins.ls_chg_dte_ojb = tot.ls_chg_dte_ojb 
+0

があっても正しいですか?合計にjob_class_obj = 'S'の値のみが含まれるのはなぜですか? –

+1

最初のインナーセレクト( '合計')と2番目( 'サービス')の間の相違点は何でしょうか? – deutschZuid

+1

以下のコメントで述べたように、エイリアスの区切りには一重引用符を使用しないでください。この構文は推奨されていません。 [角括弧]、 "二重引用符"、または区切り文字を使用しないでください。 –

答えて

2

の線に沿って何かをしてみてください簡単な方法でカウント:

SELECT 
    COUNT(CASE WHEN job_class_ojb = 'S' THEN 1 END) AS [Total], 
    COUNT(CASE WHEN job_class_ojb = 'S' THEN 1 END) AS [Service], 
    COUNT(CASE WHEN job_class_ojb in ('C', 'R') THEN 1 END) AS [Installs] 
FROM 
    [COMPL_INST_SVC] 
+1

'COUNT'ではなく' SUM'を意味すると思う - この場合の 'COUNT'は、' COUNT'が実際の値ではなく行をカウントするので、各列で同じ値を返します。また、エイリアスの区切りには一重引用符を使用しないでください。この構文は廃止予定です。 [角括弧]、 "二重引用符"、または区切り文字を使用しないでください。 –

+1

'SUM'は場合によっては' NULL'を返すことがありますが、これは問題になります。その理由で 'COUNT'を使うのが良いでしょう。 –

+0

一重引用符は実際には推奨されていません。私は私の答えを更新すべきです。 –

2

2つのサブ選択は同じです。 「サービス」1を無視し、トータル・サービスの数がまったく同じものを数えているので、あなたはそれを修正する必要がありますが、ここであなたがどのように基本的だように見えます

SELECT 
SUM(CASE WHEN job_class_ojb = 'S' THEN 1 ELSE 0 END) as Total, 
SUM(CASE WHEN job_class_ojb = 'C' or 
       job_class_ojb = 'R' THEN 1 ELSE 0 END) as Installs 
FROM COMPL_INST_SVC 
1

私は合計サブクエリがWHERE job_class_ojb = 'S'条件を含めるべきではないと思われる - もしそうなら、私はお勧め:

SELECT COUNT(*) Total, 
     SUM(CASE WHEN job_class_ojb = 'S' THEN 1 ELSE 0 END) Service, 
     SUM(CASE WHEN job_class_ojb in ('C','R') THEN 1 ELSE 0 END) Installs, 
     ls_chg_dte_ojb 
FROM COMPL_INST_SVC 
GROUP BY ls_chg_dte_ojb 
+0

あなたの答えは 'GROUP BY'を含む唯一のものですが、 'COUNT' – CodingIsAwesome

関連する問題