2013-08-21 6 views
1

J'ai un tableau d'inventaire avec une condition à savoir nouveau, utilisé, autre, et je suis interroger un petit ensemble de ces données, et il est possible que tous le jeu d'enregistrements contient seulement 1 ou toutes les conditions. J'ai essayé d'utiliser une déclaration de cas, mais si l'une des conditions ne se trouve pas rien pour cette condition est revenu, et je en ai besoin pour retourner 0comptage des enregistrements sur la même table avec des valeurs différentes éventuellement aucun serveur SQL 2008

C'est ce que je l'ai essayé jusqu'à présent:

select(
case 
    when new_used = 'N' then 'new' 
    when new_used = 'U' then 'used' 
    when new_used = 'O' then 'other' 
    end 
    )as conditions, 
    count(*) as count 
from myDB 
where something = something 
group by(
case 
    when New_Used = 'N' then 'new' 
    when New_Used = 'U' then 'used' 
    when New_Used = 'O' then 'other' 
end 
) 
Ce

renvoie les données comme:

conditions | count 
------------------ 
new   10 
used   45 

Je suis en train d'obtenir les données pour revenir à ce qui suit:

conditions | count 
------------------ 
new  | 10 
used  | 45 
other  | 0 

Merci à l'avance

Répondre

3
;WITH constants(letter,word) AS 
(
    SELECT l,w FROM (VALUES('N','new'),('U','used'),('O','other')) AS x(l,w) 
) 
SELECT 
    conditions = c.word, 
    [count] = COUNT(x.new_used) 
FROM constants AS c 
LEFT OUTER JOIN dbo.myDB AS x 
ON c.letter = x.new_used 
AND something = something 
GROUP BY c.word; 
+0

fonctionne comme un charme. Pourriez-vous expliquer la partie "WITH (...)? –

+2

Cela s'appelle une [expression de table commune] (http://technet.microsoft.com/fr-fr/library/ms175972.aspx) .Non nécessaire dans ce cas, Je préfère juste à une approche de table dérivée (qui est ce que Mike a utilisé dans sa réponse) –

+1

Vous pourriez également être intéressé par l'article sur [Using Common Table Expressions] (http://technet.microsoft.com/fr-fr/) /library/ms190766(v=sql.105).aspx) Je l'ai trouvé utile en plus de l'article de CTE auquel Aaron fait référence dans son commentaire: –

0

Vous pouvez le faire en cross-tab:

select 
sum(case when new_used = 'N' then 1 else 0 end) as N, 
sum(case when new_used = 'U' then 1 else 0 end) as U, 
sum(case when new_used = 'O' then 1 else 0 end) as Other 
from myDB 
where something = something 
+0

Bien sûr, sans pivotant cela produit la sortie "sur son côté" - par exemple une colonne pour chaque condition, au lieu d'une ligne pour chaque condition. –

+0

J'ai essayé, mais j'ai besoin d'eux sur des lignes différentes. –

2

essayer ce -

DECLARE @t TABLE (new_used CHAR(1)) 
INSERT INTO @t (new_used) 
    SELECT t = 'N' 
    UNION ALL 
    SELECT 'N' 
    UNION ALL 
    SELECT 'U' 

SELECT conditions, ISNULL(r.cnt, 0) AS [count] 
FROM (
    VALUES('U', 'used'), ('N', 'new'), ('O', 'other') 
) t(c, conditions) 
LEFT JOIN (
    SELECT new_used, COUNT(1) AS cnt 
    FROM @t 
    --WHERE something = something 
    GROUP BY new_used 
) r ON r.new_used = t.c 

en sortie -

new  2 
used 1 
other 0 
+1

mon erreur. downvoters s'il vous plaît voir ma réponse. –

+0

@Aaron Bertrand merci pour votre avis :) –

+1

Pas de problème, simple faute de frappe c'est tout. :-) –

Questions connexes