2010-10-15 2 views
2

Assumer le tableau suivant:Comment est-ce que je compte combien de ces colonnes ont une valeur en SQL?

ID | Item1 | Item2 | Item3 | Item4 | Item5 
------------------------------------------ 
A | NULL | NULL | YES | YES | NULL 
B | NULL | NULL | NULL | YES | NULL 
C | NULL | NULL | NULL | NULL | NULL 

Je veux retourner l'ensemble de données suivantes:

ID | Count 
------------ 
A | 2 
B | 1 
C | 0 

Fondamentalement, je veux un compte combien de colonnes de Item1-5 sont pas NULL pour cette ID

Comment puis-je faire cela en MS-SQL?

Répondre

4

Non testé, mais quelque chose comme ceci devrait fonctionner.

SELECT 
    Id, 
    SUM(
    CASE WHEN Item1 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item2 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item3 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item4 is NULL THEN 0 ELSE 1 END 
    + 
    CASE WHEN Item5 is NULL THEN 0 ELSE 1 END 
    ) 'Count' 
FROM 
    tableName 
GROUP BY 
    Id 
+0

Je peux me tromper, mais je vais BET que l'ID est une clé primaire, ce qui signifie que les 'SUM()' et 'GROUP BY' ne sont pas nécessaires et ajoutera simplement overhead à la requête –

+0

Je pensais la même chose, mais je ne voulais pas assumer. –

0

Cela devrait le faire:

SELECT ID, (case when item1 is null then 0 else 1 end)+ 
      (case when item2 is null then 0 else 1 end)+ 
      (case when item3 is null then 0 else 1 end)+ 
      (case when item4 is null then 0 else 1 end)+ 
      (case when item5 is null then 0 else 1 end) AS Count 
FROM Table 
ORDER BY ID 

J'espère que cela est une question hypothétique et non une table de production réelle.

+0

Il est en fait une vente unique vraiment bizarre requête voulant savoir si un produit a certaines propriétés non définies à null –

+0

Merci Joe pour ajouter les extrémités :). –

+0

vous obtiendrez une erreur avec ce code, car "END" est requis pour chaque CAS. En outre, le "quand NULL" ne fonctionnera pas et chaque ligne retournera un nombre de 5. –

2

Essayez:

DECLARE @YourTable table (ID char(1), Item1 varchar(3), Item2 varchar(3), Item3 varchar(3), Item4 varchar(3), Item5 varchar(3)) 
INSERT @YourTable VALUES ('A' , NULL , NULL , 'YES' , 'YES' , NULL) 
INSERT @YourTable VALUES ('B' , NULL , NULL , NULL , 'YES' , NULL) 
INSERT @YourTable VALUES ('C' , NULL , NULL , NULL , NULL , NULL) 

SELECT 
    ID, CASE WHEN ITEM1 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM2 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM3 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM4 IS NULL THEN 0 ELSE 1 END 
     +CASE WHEN ITEM5 IS NULL THEN 0 ELSE 1 END AS [Count] 
    FROM @YourTable 

SORTIE:

ID Count 
---- ----------- 
A 2 
B 1 
C 0 

(3 row(s) affected) 
0

Juste une autre option: Si vous êtes dans sql 2k5 ou plus tard, vous pouvez également utiliser un UNPIVOT pour compter tous les non-nulle valeurs. Cependant, vous n'obtiendrez pas de lignes pour les comptes zéro directement à partir de cette requête. Cela permet cependant d'économiser l'ennui des déclarations de cas.

select 
    ID, count(ItemCount) as ItemCount 
from 
(
    select ID, Item1, Item2, Item3, Item4, Item5 
    from TableA a 
) t 
unpivot 
(
    ItemCount for Item in 
    (
     Item1, Item2, Item3, Item4, Item5 
    ) 
) as unpvt 
group by 
    ID 
0

Une autre technique.

SELECT 
    ID, 
    (SELECT COUNT(C) FROM( 
      SELECT Item1 C 
      UNION ALL 
      SELECT Item2 
      UNION ALL 
      SELECT Item3 
      UNION ALL 
      SELECT Item4 
      UNION ALL 
      SELECT Item5) 
      D) 
AS [Count] 
FROM @YourTable