2017-05-12 3 views
0

Dans une application, j'ai une table avec trois champs, identifiant, nom et nombre.Comment obtenir une liste dans une requête SQL

Id | Name | Value 
1 | A |  5 
2 | B |  9  
3 | C |  9 
4 | D |  5 
5 | E |  6 
6 | F |  6 

maintenant, comment puis-je obtenir une table croisée à partir de ce qui précède? Je veux dire, comme suit:

Value | Count 
---- | ---- 
5  | 2 
6  | 2 
7  | 0 
8  | 0 
9  | 2 

pouvez-vous aider, s'il vous plaît?

+2

Qu'avez-vous essayé de faire jusqu'à maintenant? – Donnie

+0

Je peux obtenir des valeurs existantes pour la valeur du champ, mais je ne sais pas comment remplir toutes les valeurs entre ... alors ... pas d'ideia comment obtenir le compte ... –

+0

D'où viennent les valeurs 7 et 8? En outre, étiqueter votre question avec la base de données que vous utilisez. –

Répondre

1

D'abord, vous devez créer une table de pointage. Il y a many methods pour cela. Vous utiliserez la table de pointage pour numéroter toutes les valeurs comprises entre min et max de votre table source. Une fois que vous avez tous les nombres entre min et max, vous aurez besoin de LEFT JOIN ceux dans une une version de votre table où vous utilisez COUNT() et GROUP BY pour totaliser le nombre de fois que chaque valeur apparaît. Ci-dessous le tableau A est la table de pointage. Le tableau B est votre table source agrégée.

DECLARE @MinValue INT 
DECLARE @MaxValue INT 
SET @MinValue = (SELECT MIN(Value) FROM dbo.MyTable) 
SET @MaxValue = (SELECT MAX(Value) FROM dbo.MyTable) 

SELECT number as Value, COALESCE(Count,0) AS Count 
FROM (
    SELECT DISTINCT number 
    FROM master..spt_values 
    WHERE number 
    BETWEEN @MinValue AND @MaxValue 
) AS A 
LEFT JOIN (
    SELECT Value, COUNT(Value) AS Count 
    FROM dbo.MyTable 
    GROUP BY Value 
) AS B 
ON A.number = B.value 
+0

La meilleure façon de rendre la table varie énormément en fonction de rdbms, ce qui n'a pas été spécifié. – Donnie