Avancée du GROUPE SQL PAR la requête
J'ai deux colonnes dans ma table Articles 'Catégorie', 'Catégorie2", les deux colonnes contiennent essentiellement les mêmes informations. Si j'avais conçu la base de données, j'aurais créé un tableau distinct pour les catégories et les éléments ajoutés à des catégories de base de ce tableau, malheureusement je n'ai pas de créer la base de données et je ne peux pas le changer maintenant, mais je pense qu'il y a encore du chemin à faire ce que je veux faire.
Un exemple de la table est indiqué ci-dessous
Category Category2
------------------ -----------------
truck full size - pickup
full size - pickup truck
Sedan Import - Sedan
Convertible Domestic - Coupe
Je veux exécuter une requête pour compter le nombre total de camions, les berlines pleine grandeur /pick - up, etc. J'ai essayé la requête ci-dessous, mais il a groupé les deux colonnes séparément
SELECT Category, Count(*) as Count
FROM Items
GROUP BY Category, Category2
Ainsi, pour cet exemple, vous pouvez vous attendre à recevoir ce qui suit: camion = 2 ; Taille Complète - Pickup = 2 ; Berline = 1 ; Convertible = 1 ; Import - Sedan = 1 ; Intérieur - Coupe = 1 ?
C'est exact, les deux David B et araqnid à la fois cloué la solution. Merci à tous!!
OriginalL'auteur Patcouch22 | 2009-05-13
Vous devez vous connecter pour publier un commentaire.
Viens de vider les deux catégories en une seule colonne, avant le regroupement.
OriginalL'auteur Amy B
Imaginer qu'une ligne avec "catégorie, catégorie2" peut être transformé en deux lignes (une par "catégorie", l'un avec "catégorie2") pour obtenir ce que vous voulez. Vous auriez du le faire comme ceci:
Donc, tout ce que vous devez faire est d'agréger ces:
Vous pouvez également faire la somme par étapes comme cela si votre base de données prend en charge:
Cela permettra de limiter seulement à une analyse des principaux éléments de la table, bon si vous avez seulement un petit nombre de catégories. Vous pouvez émuler la même chose avec le temp des tables dans les bases de données qui ne supportent pas les "..."
EDIT:
J'étais sûr qu'il y avait une autre façon de le faire sans la numérisation d'Éléments deux fois, et il est. Eh bien, c'est la version de PostgreSQL:
La seule postgresql-bit spécifique ici est "generate_series(1,2)" qui produit un "tableau" contenant deux rangées, l'une avec "1" et un "2". Ce qui est à mon humble avis l'une des caractéristique les plus utiles dans postgresql. Vous pouvez mettre en œuvre des choses similaires à SQL Server en tant que bien, bien sûr. Ou vous pourriez dire "(choisir 1 en tant que sélecteur union all select 2)". Une autre alternative est "(valeurs(1),(2)) de la série(sélecteur)" bien que la proportion de cette syntaxe est standard et combien est-postgres-spécifique, je ne suis pas sûr. Ces deux approches ont l'avantage de donner le planificateur d'une idée qu'il n'y aura que deux lignes.
De la croix-joindre à cette série, les éléments de tableau nous permet de générer des deux lignes de sortie pour chaque ligne de l'article. Vous pouvez même prendre que "items_fixed" sous-requête et d'en faire une vue -- qui btw, c'est l'inverse du processus, j'ai tendance à l'utiliser pour essayer de résoudre ce genre de problèmes.
La base de données avez-vous essayé la variante avec? (ahem) je l'ai testé avec la version bêta de PostgreSQL 8.4, où je comprends qu'il est essentiellement mis en œuvre comme une table temporaire, implique un seq scan "Articles" et les deux CTE scans, ce qui je suppose sont seq analyses de la temp résultat. Ce n'est pas nécessairement une victoire; que si le nombre de catégorie de combinaisons est significativement plus petit que le nombre d'éléments; mais cela semble probable.
Merci!! Très Instructif - a donné la réponse à David pour répondre à une min plus tôt, mais merci de vous l'expliquer!
J'ai couru sur Sql Server 2005. J'ai été à la recherche d'un moyen de faire des requêtes comme cela dans une seule analyse de la table pour un moment.
Ironiquement, j'ai essayé à la fois l'union et la seule méthode de numérisation dans postgres avec un plus grand mannequin du jeu de données, et l'union fait mieux pour les plus grandes valeurs; la base de données passe pour une sorte/groupaggregate avec la simple-scan, et un hashaggregate pour l'union. Va juste pour montrer, vous devriez toujours tester, pas de deviner.
OriginalL'auteur araqnid
essayer
OriginalL'auteur SQLMenace
im sûr qu'il y a une meilleure manière de le faire, mais ici ya aller
ouais, vous avez raison. je l'ai corrigé.
OriginalL'auteur DForck42
essayer cette
sélectionnez le type 1,count(*)à compter à partir de la table où la catégorie like '%pleine taille - ramassage%'
union
sélectionnez le type 2,count(*) à compter à partir de la table où la catégorie like '%camion%'
union
sélectionnez le type 3,count(*) à compter à partir de la table où la catégorie like '%berline%'
et ainsi de suite......
de type 1 sera votre pleine grandeur le comte
type 2 de votre camion comte
et ainsi de suite....
espère que cette aide
il peut créer une procédure stockée avec la catégorie en tant que paramètre.
Et de l'appeler une fois pour chaque catégorie? Un peu inutile, non?
Cette réponse même si elle a beaucoup de problèmes, donc +1 pour compenser les downvotes! 😛
Donc, serait un curseur.... 😛
OriginalL'auteur Eric