2012-02-14 3 views
1

J'utilise SQL Server 2005.SQL - Comment simplifier cette requête facile?

Comment refactoriser cette requête?

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

Est-ce même correct? Pourquoi le total n'inclut-il que les valeurs où job_class_obj = 'S'? –

+1

Quelle est la différence supposée entre le premier select interne ('total') et le second ('service')? – deutschZuid

+1

Comme je l'ai mentionné dans un commentaire ci-dessous, vous ne devriez pas utiliser des guillemets simples pour délimiter les alias - cette syntaxe est en train d'être dépréciée. Utilisez [crochets], "guillemets doubles" ou pas de délimiteurs. –

Répondre

2

Il semble que le total et le nombre de services comptent exactement la même chose, vous aurez donc besoin de corriger cela, mais voici essentiellement la façon dont vous faites les chiffres d'une façon plus simple:

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

Je pense que vous vouliez dire 'SUM' pas' COUNT' - 'COUNT' dans ce cas retournera la même valeur dans chaque colonne, puisque' COUNT' ne compte que la ligne, pas les valeurs réelles. De même, vous ne devez pas utiliser de guillemets simples pour délimiter les alias - cette syntaxe est en train d'être abandonnée. Utilisez [crochets], "guillemets doubles" ou pas de délimiteurs. –

+1

'SUM' peut retourner' NULL' dans certains cas, ce qui peut poser problème. Mieux vaut utiliser 'COUNT' pour cette raison. –

+0

Les guillemets simples sont en effet obsolètes. Je devrais mettre à jour ma réponse. –

2

Deux de vos sous-sélections sont identiques. Ignorant le « Service » un, essayer quelque chose le long des lignes de

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

Je soupçonne que la sous-requête totaux ne doit pas inclure la condition WHERE job_class_ojb = 'S' - si oui, je suggère:

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

Votre réponse est la seule qui incluait le 'GROUP BY' mais j'ai préféré utiliser 'COUNT' – CodingIsAwesome