2010-09-19 1 views
3

J'utilise une sous-requête pour renvoyer un nombre en tant que valeur entière à ma requête principale. Cette requête est utilisée pour relier un DataGrid ASP.NET et j'ai seulement deux caractères largeur disponible pour cette colonne. Je veux limiter la largeur à deux caractères. Donc, je veux définir une valeur de 99 lorsque le nombre dépasse 99. Je ne peux pas trouver un moyen de le faire? Je ne vois pas comment appliquer une déclaration de cas ici.forcer un plafond à compter (*) en requête sql

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    SELECT COUNT(*) 
FROM SessionOrder 
WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 
    And SessionOrder.SORD_NumberCompleteDownloads <> 0 
    As MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member 

Comment cela peut-il être fait?

+0

Etes-vous sûr que votre requête actuelle est valide? –

+0

J'ai omis quelques détails mais assez pour montrer ce que je tente. – Jim

Répondre

1

L'expression CASE peut ressembler à ceci:

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END 

Il semble y avoir quelques erreurs avec votre requête existante (par exemple m n'est pas défini). Avec ces erreurs corrigées et le changement ci-dessus fait la requête résultante pourrait ressembler à ceci:

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    (
     SELECT CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END 
     FROM SessionOrder 
     WHERE SessionOrder.SORD_MEMB_ID = MEMB_ID 
     AND SessionOrder.SORD_NumberCompleteDownloads <> 0 
    ) AS MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member 
+0

Ok, donc je vais devoir faire deux fois la sous-requête pour faire ça? J'espérais éviter cela mais peut-être que je n'ai pas le choix? – Jim

+0

@Jim: Pourquoi avez-vous besoin d'effectuer la sous-requête deux fois? –

+0

Je vais essayer! On dirait un gagnant! Merci beaucoup! – Jim

2

Remplacer

COUNT(*) 

Avec

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END AS YourColumnName 
0

cas, il devrait être ...

0

ou double UNION SELECT comme MEMB_ID, MEMB_Name, SELECT COUNT (*) AS WC DE SessionOrder OÙ SessionOrder.SORD_MEMB_ID = m.MEMB_ID Et SessionOrder.SORD_NumberCompleteDownloads <> 0 et WC = Comme MEMB_Dow nloads, MEMB_JoinDate DE L'UNION membres SELECT MEMB_ID, MEMB_Name, 99 AS WC DE SessionOrder OÙ SessionOrder.SORD_MEMB_ID = m.MEMB_ID Et SessionOrder.SORD_NumberCompleteDownloads <> 0 et WC> 99 Comme MEMB_Downloads, MEMB_JoinDate FROM Membre

1

Cela peut être un peu plus efficace. Comme il peut arrêter de balayer les lignes une fois que le 99e est atteint.

SELECT MEMB_ID , 
     MEMB_Name, 
     (SELECT COUNT(*) 
     FROM ( 
       SELECT TOP 99 * 
       FROM SessionOrder 
       WHERE SessionOrder.SORD_MEMB_ID = MEMB_ID 
       AND  SessionOrder.SORD_NumberCompleteDownloads <> 0 
       ) 
       Top99 
     ) AS MEMB_Downloads, 
     MEMB_JoinDate 
FROM Member 
+0

Martin, merci pour la limite. Oui, cela devrait être mieux. – Jim

+0

"SELECT TOP 99 *": sélectionnez l'ID uniquement, ou quelque chose, ne gaspillez pas le processeur. (Si vous avez de la chance, le système devinera cela pour vous.) – ANeves

1

Plutôt que de changer le COUNT (*) résultat, meilleur nombre au plus 99:

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    (SELECT COUNT(*) 
     FROM (
     SELECT TOP(99) * 
     FROM SessionOrder 
     WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 
     And SessionOrder.SORD_NumberCompleteDownloads <> 0) 
     as TOP99_Downloads) 
    As MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member; 

De cette façon, vous éviter de compter tous les téléchargements lorsque vous ne diffuserons 99 de toute façon. Bien sûr, on peut se demander à quoi sert d'afficher une valeur si elle est incorrecte au départ et pourquoi ne pas rendre votre couche d'interface utilisateur capable d'afficher «plus de 99».

+0

Merci, cette limite a du sens. J'ai plusieurs de ces compteurs dans une grille de données avec un espace très limité disponible. Mon client veut beaucoup trop d'informations sur une seule page. Pas comment je le voudrais non plus! Merci – Jim

+0

@ANeves: En fait '*' est la meilleure option. Avec '*' l'opérateur COUNT ci-dessus est libre de compter * any * column, et l'optimiseur de requête choisira la colonne qui peut être comptée en utilisant l'index le plus étroit possible. –

+0

En fait mon commentaire précédent est faux, merci @Remus Rusanu. [Commentaire précédent supprimé.] * Est la meilleure option, et compter une colonne particulière au lieu de * pourrait même donner des résultats inattendus s'il y avait des valeurs nulles (non comptées). – ANeves