2017-10-12 12 views
2

Premier article ici! Vraiment besoin d'aide.Comptez le nombre de fois qu'une valeur se produit dans les tables

J'ai une table avec des bâtiments. Dans ce tableau, il y a un certain nombre d'attributs, dont je suis intéressé par 2:

- roof_material 
- additional_roof_material 

Dans le matériau du toit de la colonne, il y a 10 différents matériaux de toiture, avec les numéros 1-10.

Le même type de matériaux de toiture supplémentaires sont listés dans additional_roof_material.

Comment compter combien de fois les bâtiments avec roof_material 1, ont un_roof_material 1 supplémentaire, pour une instance?

C'est ce que je veux faire, juste pour tous les matériaux:

Select count(*) 
From dbo.40000t where roof_material = 1 and additional_roof_material = 1 

Je veux le faire pour chacun des types, donc j'obtenir une complète comparision combien de fois roof_material 1,2, 3,4,5,6,7,8,9,10 a un_roof_matériel 1,2,3,4,5,6,7,8,9,10 supplémentaire.

+0

peut vous donner un exemple? Ecrire une table et le résultat attendu, s'il vous plaît. – marco

+1

Vous avez étiqueté cette question comme mysql et postgresql - pourriez-vous préciser quelle langue de base de données est utilisée s'il vous plaît? – Scoots

Répondre

2

Vous pouvez obtenir compte de permutation à partir d'une table à l'aide sum() une déclaration de cas

select 
    sum((case when roof_material = 1 and additional_roof_material = 1 then 1 else 0 end)) as material_1_1, 
    sum((case when roof_material = 2 and additional_roof_material = 2 then 1 else 0 end)) as material_2_2 
    -- etc... 
from 
    dbo.40000t 

Cette requête a une clause group by implicite - parce que je ne fais que choisissais des agrégats que je ne ai pas besoin de spécifier explicitement un group by.


Mise à jour

Comme demandé dans un commentaire, si vous voulez que chaque permutation comme un enregistrement distinct

select 
    roof_material, 
    additional_roof_material, 
    count(1) as num_instances 
from 
    dbo.40000t 
-- Not sure if you want permutations where roof_material != additional_roof_material or not. 
-- Uncomment these next 2 lines if you do not want those permutations 
--where 
-- roof_material = additional_roof_material 
group by 
    roof_material, 
    additional_roof_material 
+0

Merci! Je pense que cela fonctionnera parfaitement. Je viens de réaliser que le type de données est du texte, cela va-t-il causer des problèmes si je lance en int, à l'intérieur de la somme()? – asguldbrandsen

+0

En fait, il ne renvoie que: 1 pour le matériel_1_1 et 2 pour le matériel_2_2 .... Est-ce que la fonction de moulage peut causer des problèmes? – asguldbrandsen

+0

Vous pouvez convertir les colonnes en int ou envelopper les nombres entre guillemets 'lorsque roof_material = '1'' - l'un ou l'autre fonctionnera. – Scoots