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é. P>
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. P>
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? P>
4 Réponses :
une option, à l'aide de Nombre () code> comme fonction analytique:
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?
Un moyen est de séparer le comptage du reste: Vous devrez peut-être ajouter un distinct p> p> p> p> P>
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 code> Vous devez placer juste après le SELECT CODE>, donc Sélectionnez T1.DepartmentName ... Code>
D'accord, super. Merci!
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;
@ 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.
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
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!
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.