2011-07-11 1 views
2

Je ne suis pas sûr s'il y a un concept ou un modèle facile à faire, donc je vais devoir le décrire.Comment grouper des colonnes dans la table sql pour le comptage

Disons que j'ai une table comme ceci:

CallID (uniqueidentifier) 
CallDateTime (datetime) 
CallIssue (varchar(100)) 
Pollution (bit) 
Violation (bit) 
Accident (bit) 
General (bit) 

Et je veux obtenir compte sur un rapport. 30 appels différents chefs d'accusation ressemblerait à ceci:

Pollution: 4 
Violation: 3 
Accident: 2 
General: 7 
Pollution & Violation: 5 
Pollution & Accident: 9 

ce qui se passerait est que si un appel avait à la fois la pollution et violation mis en elles seraient comptées séparément que les appels ayant seulement la pollution ou de violation.

Existe-t-il un moyen, autre qu'un curseur, de faire cela?

Nous utilisons SQL 2005.

Répondre

1

Quelque chose comme cela pourrait faire le décompte pour vous.

select sum(case Pollution when 1 then 1 else 0 end) as Pollution, 
     sum(case Violation when 1 then 1 else 0 end) as Violation, 
     sum(case Accident when 1 then 1 else 0 end) as Accident, 
     sum(case General when 1 then 1 else 0 end) as General, 
     sum(case when Pollution = 1 and Violation = 1 then 1 else 0 end) [Pollution & Violation], 
     sum(case when Pollution = 1 and Accident = 1 then 1 else 0 end) [Pollution & Accident] 
from YourTable 
0

Je ne suis pas gourou SQL, mais du haut de ma tête

SELECT 
    SUM(CASE WHEN Pollution= 1 THEN 1 ELSE 0 END) AS Pollution, 
    SUM(CASE WHEN Violation= 1 THEN 1 ELSE 0 END) AS Violation, 
    SUM(CASE WHEN Accident= 1 THEN 1 ELSE 0 END) AS Accident, 
    SUM(CASE WHEN Pollution & Violation= 1 THEN 1 ELSE 0 END) AS [Pollution_And_Violation], 
    SUM(CASE WHEN Pollution & Accident= 1 THEN 1 ELSE 0 END) AS [Pollution_And_Accident], 
FROM 
dbo.Table 

EDIT:

Le même que Mikael, en utilisant uniquement des opérations au niveau du bit.

+0

Juste pour clarifier, il n'y a pas de colonne Pollution & Violation. Je pourrais utiliser ceci, mais je devrais faire: SOMME (CAS WHEN Pollution = 1 ET Violation = 1 ALORS 1 ELSE 0 FIN) AS [Pollution & Violation], SOMME (CAS QUAND Pollution = 1 ET Violation = 0 THEN 1 ELSE 0 END) AS [Pollution], SOMME (CAS O WH Pollution = 0 ET Violation = 1 ALORS 1 ELSE 0 FIN) AS [Violation] –

+0

Je comprends qu'il n'y a pas de colonne "Pollution & Violation". C'est juste une opération sur les colonnes "Pollution" et "Violation" car vous avez affaire à des bits. Si les deux colonnes sont vraies, l'instruction renvoie 1, sinon 0. Identique à la solution de Mikael, n'utilisant que le fait que vous avez des bits. Vous pouvez le tester vous-même. Il suffit d'exécuter une requête en faisant un SELECT COUNT (*) où Pollution & Accident = 1. – Khepri

0

Simplement faire un GROUP BY pollution, violation, accident, general devrait vous donner les rollups comme vous le souhaitez (que vous pouvez faire un count(*) de). Vous pouvez ensuite lire les colonnes groupées pour déterminer le rollup auquel vous faites référence.
Veuillez noter que si vous prévoyez d'utiliser un programme d'affichage, un curseur peut être nécessaire dans tous les cas, mais dans la plupart des cas, l'agrégation et le tri doivent être effectués dans la couche de base de données.

Voici un exemple de requête:

SELECT pollution, violation, accident, general, count(*) 
FROM callTable 
GROUP BY pollution, violation, accident, general 

Faire des choses comme le réglage de l'affichage à « la pollution & Violation » peut alors être fait - dans votre code d'application - en testant si la colonne de bit correspondant est réglé sur « 1 ou quoi que ce soit, et affichant le nombre.

Questions connexes