0
votes

Comptez le résultat incorrect

J'ai écrit une requête de compte qui ne fonctionne pas, comme prévu. La requête est ci-dessous et il renvoie trois colonnes - Deparmtmentname, Nom de la catégorie et Numberfcats.

La colonne NumberOfcats doit indiquer le nombre de catégories dans un département donné.

Donc, avec le tableau ci-dessous, la colonne NumberOfcats doit avoir le numéro 4 de chaque rangée, au lieu de 1, car le département de cuisson a 4 catégories, dans ce cas.

Est-ce que quelqu'un sait comment je peux modifier le code, afin qu'il renvoie le bon résultat, s'il vous plaît?

 Entrez la description de l'image ici xxx


1 commentaires

Si vous avez des niveaux d'agrégation différents, la manière la plus courante est d'utiliser différentes requêtes pour calculer, puis de les rejoindre, comme la solution de miel.


4 Réponses :


1
votes

une option, à l'aide de Nombre () comme fonction analytique: xxx


2 commentaires

Désolé avait une faute de frappe là-bas.


Salut Tim, merci d'avoir posté ceci. Cependant, lorsque j'exécute ce code, il retourne plus de 1 000 enregistrements pour le nombre de catégories, trop élevé. La réponse postée par Honeybadger donne le résultat correct ... Je ne suis donc pas sûr de ce qui doit être changé avec le code ici?



2
votes

Un moyen est de séparer le comptage du reste: xxx

Vous devrez peut-être ajouter un distinct


4 commentaires

Salut Honeybadger - Merci d'avoir posté ça! Cela donne le résultat correct - mais cela les duplique, comme vous l'avez prédit. Savez-vous où je devrais ajouter la clause distincte de la requête afin d'empêcher les duplicats? De plus, je ne comprends pas ce que les bits T1 et AF signifiaient dans le code - il a toujours travaillé avec eux, mais si vous pouviez clarifier ce qu'ils veulent dire, il serait apprécié.


@ MR2017 T1 est un nom de table d'espace réservé. AG signifie que je suppose que c'est le nom de la "Table de jointure" qui est agrégée par la sélection dans la jointure. Lorsque vous faites des requêtes où des tables se joignent à elles-mêmes, etc., vous leur donnez habituellement des noms.


@ MR2017 ... Comme Tschallacka expliqua, T1 et AG sont des alias (en fait, j'avais eu l'intention d'agir de représenter son agrégat, c'est un alias habituel que j'utilise dans des situations comme celle-ci). Le distinct Vous devez placer juste après le SELECT , donc Sélectionnez T1.DepartmentName ...


D'accord, super. Merci!



1
votes

En ajoutant une sous-requête à votre requête, vous pouvez obtenir les données dont vous avez besoin. Si votre table est http: // sqlfiddle. Com / #! 18 / D30E1 / 1 P>

La déclaration Créer. P>

SELECT 
        DepartmentName,
        CategoryName,       
        (select 
            COUNT(distinct CategoryName) from v_EnterpriseStructure as v2 
            where v1.DepartmentName = v2.DepartmentName

        ) as NumberOfCats
FROM v_EnterpriseStructure as v1
group by DepartmentName,
         CategoryName
ORDER BY DepartmentName; 


9 commentaires

@ MR2017 J'ai modifié ma réponse. Cela pourrait être ce que vous cherchez? Un nombre de catégories différentes au sein du nom de département?


Bonjour Tschallacka, merci d'avoir posté ceci. Lorsque je l'exécute, cependant, je reçois le message d'erreur indiqué ici: MSG 4405, niveau 16, état 1, ligne 5 Affichage ou fonction 'v_enterpriSestructure' n'est pas mis à jour car la modification affecte plusieurs tables de base. MSG 4405, niveau 16, état 1, ligne 9 Affichage ou fonction 'v_enterpriSestructure' n'est pas mis à jour car la modification affecte plusieurs tables de base. En outre, il existe des dizaines de catégories dans les différents départements. Devrais-je insérer tous les noms de catégorie dans la requête, comme vous avez terminé ci-dessus? Je voudrais exécuter la requête automatiquement.


@ MR2017 La requête ci-dessus est exactement ce que j'ai inséré dans le violon SQL. J'ai ajouté la table Create ici, de sorte que, à l'avenir, si quelqu'un vient et que le lien SQL Fiddle ne fonctionne plus, ils peuvent toujours exécuter le code / créer un nouveau violon SQL. Veuillez utiliser le code de l'instruction SELECT. J'ai édité ma réponse pour le rendre plus clair qui à utiliser.


Ok, merci Tschallacka. J'ai utilisé le code de la requête ci-dessus et cela fonctionne comme prévu. Merci.


@ MR2017 Vous êtes nouveau pour empiler débordement. Pour indiquer une réponse a résolu votre problème, vous pouvez cliquer sur l'icône de coche sous les flèches UPVote / Downvote pour indiquer aux autres que cela résolvait votre problème.


OK, - Oui, je l'ai fait pour toutes les réponses qui fonctionnaient ci-dessus. Êtes-vous pas capable de les voir à votre fin?


@ MR2017 Non, je ne vois que des upvotes. Pas une marque acceptée à aucune des réponses sur cette question. Il n'y a pas de vérification verte à voir.


Ok, j'ai marqué l'un des coques. Je voudrais le faire pour tous. Cependant, il ne vous permet que de marquer une réponse avec la coche?


@ MR2017 Oui. La coche est destinée à la réponse qui résolvait votre problème. Bien qu'il puisse y avoir des solutions plus usuables, celle qui a résolu votre problème le meilleur / celui que vous avez utilisé doit être indiqué avec la coche comme réponse appropriée. D'autres réponses viables peuvent se tenir debout avec un uppote.



3
votes

semble être une fonction de fenêtre s'occupera de ces personnes assez facilement:

SELECT 
        DepartmentName,
        CategoryName,       
        COUNT( CategoryName) OVER(Partition by DepartmentName) as NumberOfCats
FROM v_EnterpriseStructure
group by DepartmentName,
        CategoryName


3 commentaires

Seulement si vous n'avez pas de duplicats.


C'est correct, mais comme vous remarquerez que c'est le même problème avec chaque réponse sur ce fil. Depuis que l'OP n'a jamais mentionné que je suppose qu'il n'y a pas


Parfait! C'est exactement ce que je cherche! Merci JMabee!