Imaginez qu'une ligne de « catégorie, category2 » peut être transformé en deux lignes (une avec « catégorie », une avec « category2 ») pour obtenir ce que vous voulez. Tu ferais ça comme ça:
SELECT items.category /* , other columns... */
FROM items
UNION ALL
SELECT items.category2 /* , other columns... */
FROM items
donc tout ce que vous devez alors faire est globale à travers ceux-ci:
SELECT category, count(*) FROM (
SELECT items.category FROM items
UNION ALL
SELECT items.category2 FROM items
) expanded
GROUP BY category
Vous pouvez également faire l'ensemble par étapes comme celle-ci si votre base de données supporte:
with subcounts as (
select items.category, items.category2, count(*) as subcount
from items
group by category, category2)
select category, sum(subagg) as finalcount from (
select subcounts.category, sum(subcount) as subagg from subcounts group by category
union all
select subcounts.category2, sum(subcount) as subagg from subcounts group by category2
) combination
group by category
Cela limitera à un seul balayage de la table principale des articles, bon si vous avez seulement un petit nombre de catégories. Vous pouvez imiter la même chose avec des tables temporaires dans des bases de données qui ne supportent pas « AVEC ... »
EDIT:
Je suis sûr qu'il devait y avoir une autre façon de le faire sans numériser deux fois des articles et il y a. Eh bien, voici la version PostgreSQL:
SELECT category, count(*) FROM (
SELECT CASE selector WHEN 1 THEN category WHEN 2 THEN category2 END AS category
FROM Items, generate_series(1,2) selector
) items_fixed GROUP BY category
Le seul bit spécifique-postgresql ici est "generate_series (1,2)" qui produit une "table" contenant deux un rows-- avec "1" et une avec "2". Ce qui est IMHO l'une des fonctionnalités les plus pratiques dans postgresql. Vous pouvez également implémenter des choses similaires dans SQL Server, bien sûr. Ou vous pouvez dire "(sélectionner 1 comme union de sélection tous sélectionner 2)". Une autre alternative est "(valeurs (1), (2)) série (sélecteur)" bien que la quantité de cette syntaxe est standard et combien est spécifique à postgres, je ne suis pas sûr. Ces deux approches ont l'avantage de donner au planificateur l'idée qu'il n'y aura que deux lignes.
La jointure croisée de ces éléments de table de série nous permet de générer deux lignes de sortie pour chaque ligne d'élément. Vous pouvez même prendre cette sous-requête "items_fixed" et en faire une vue - ce qui est l'inverse du processus que j'ai tendance à utiliser pour essayer de résoudre ce genre de problèmes.
Heureux que vous au moins reconnaître e e problèmes dans la structure actuelle – HLGEM
Donc, pour cet exemple, vous vous attendez à retrouver les éléments suivants: truck = 2; Pleine taille - ramassage = 2; Sedan = 1; Convertible = 1; Importation - Berline = 1; Domestique - Coupé = 1? – BIBD
@CodeSlave - C'est exact, David B et Araqnid ont tous deux cloué la solution. Merci tout le monde!! – Patcouch22