2010-05-18 4 views
1

Dire que j'ai une table comme ceci:résultats de plusieurs de retour d'une COUNT ASP instruction SQL

Field1 Field2 Field3 Field4 
fred tom  fred harry 
tom    tom 
dick harry 
harry   

et je veux déterminer quelle proportion de celui-ci a été remplie pour chaque domaine.

J'Execute:

SELECT COUNT (Field1) WHERE (Field1 <> '') AS Field1Count  
SELECT COUNT (Field2) WHERE (Field2 <> '') AS Field2Count 
SELECT COUNT (Field3) WHERE (Field3 <> '') AS Field3Count  
SELECT COUNT (Field4) WHERE (Field4 <> '') AS Field4Count 

Est-il possible de se retrousser ces instructions SQL séparées dans un qui renverra les 4 résultats en un seul coup? Y a-t-il un avantage de performance à le faire (étant donné que le nombre de colonnes et de rangées peut être assez important en pratique)?

+0

Existe-t-il des doublons? Si oui, voulez-vous compter les valeurs en double dans la même ligne ou les ignorer? – mdma

+0

Je veux compter les valeurs dupliquées, c'est-à-dire que la réponse à l'exemple ci-dessus serait 4, 2, 2, 1. Si le contenu du champ Field3 était fred, tom, fred, fred le résultat serait 4, 2, 4, 1. – rossmcm

Répondre

1

Voilà comment je voudrais aller à ce sujet en utilisant MySQL

select sum(CASE WHEN Field1 <>'' THEN 1 ELSE 0 END) as Field1Count 
    , sum(CASE WHEN Field2 <>'' THEN 1 ELSE 0 END) as Field2Count 
    , sum(CASE WHEN Field3 <>'' THEN 1 ELSE 0 END) as Field3Count 
    ... 
    , sum(CASE WHEN FieldN <>'' THEN 1 ELSE 0 END as FieldNCount 
    from DataTable 
5

Vous pouvez faire comme ceci:

select 
    sum(case when Field1 <> '' then 1 else 0 end) as Field1Count, 
    sum(case when Field2 <> '' then 1 else 0 end) as Field2Count, 
    sum(case when Field3 <> '' then 1 else 0 end) as Field3Count, 
    sum(case when Field4 <> '' then 1 else 0 end) as Field4Count 
from TheTable 
+0

Cela fonctionne très bien, mais j'ai dû utiliser IIF au lieu de CASE pour le faire fonctionner dans MS Access (j'utilise MS Access pour déboguer mes SQL avant de les mettre en ASP). Merci pour votre réponse. – rossmcm

+0

@ user89691 - Access SQL n'est pas du vrai SQL. –

+0

Belle solution simple J'augmente votre réponse. –

2

Si vous définissez vos champs inhabitées être NULL au lieu de blancs, vous pouvez compter sur le fait que count() n'inclura pas les champs NULL. Toutes les solutions avec fonction par ligne (if, case, coalesce et ainsi de suite) conviennent aux petites bases de données, mais ne s'adaptent pas bien aux grandes bases de données. Gardez à l'esprit que petit est un terme relatif, il peut toujours être bon pour vos bases de données même si vous pensez qu'ils sont grands - je travaille dans un magasin où des millions de lignes sont les tailles de nos tables de configuration :-)

Ensuite, vous pouvez simplement utiliser:

select 
    count(field1) as count1, 
    count(field2) as count2, 
    count(field3) as count3, 
    count(field4) as count4 
from ... 

(ou count(distinct fieldX) pour des valeurs distinctes, bien sûr).

Si c'est une façon plausible d'aller, vous pouvez simplement laisser votre table mis en place avec:

update tbl set field1 = NULL where field1 = ''; 
update tbl set field2 = NULL where field2 = ''; 
update tbl set field3 = NULL where field3 = ''; 
update tbl set field4 = NULL where field4 = ''; 

Mais, comme toutes les questions de performance de base de données, mesure , ne devine pas. Et mesurer dans l'environnement cible (ou une copie appropriée). Et mesure souvent. L'optimisation de la base de données n'est pas une opération de définition et d'oubli.

+0

Je ne pensais pas pouvoir utiliser count (field) sans un groupe, mais j'ai essayé et ça marche! Je suppose que sans un groupe par, le groupe d'agrégation est l'ensemble de la table. – mdma

+0

Oui, "group by" est en réalité un expandeur de détail. 'select count (x) de tbl' comptera les valeurs non nulles de x dans toute la table (niveau de détail bas). 'select count (x) du groupe tbl par y' comptera les valeurs non nulles de x à travers chaque y distinct (niveau de détail plus élevé). – paxdiablo

Questions connexes