1
votes

Nombre de sélections SQL avec plusieurs cas

Je souhaite une colonne dans laquelle je compte les transactions où le type d'élément contient l'une des deux valeurs spécifiées ou l'emplacement contient l'une des deux valeurs spécifiées. Les deux premières colonnes (type d'article et emplacement) donnent des chiffres corrects, mais la troisième semble compter toutes les transactions, quel que soit le type d'article ou l'emplacement. Que fais-je mal?

SELECT 
  COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 END) 'itemtype',
  COUNT(CASE WHEN location IN ('Lattlast','Appelhyllan') THEN 1 END) 'location',
  COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 
             WHEN location IN ('Lattlast','Appelhyllan') THEN 1  
             ELSE 0
        END) 'total'  
FROM statistics


4 commentaires

quel est votre résultat attendu?


Bonjour, quel SGBD utilisez-vous (par exemple, SQL Server, MySQL, etc.)


Pourquoi ne pouvez-vous pas faire correspondre l'emplacement et le type d'élément dans la clause where


@Klas Changez simplement ELSE 0 en ELSE NULL ou supprimez-le car ELSE NULL est déjà implicite.


4 Réponses :


1
votes

Pour le dernier, vous pouvez utiliser SUM au lieu de COUNT comme ci-dessous -

SELECT 
  COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 END) 'itemtype',
  COUNT(CASE WHEN location IN ('Lattlast','Appelhyllan') THEN 1 END) 'location',
  sum(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 
  WHEN location IN ('Lattlast','Appelhyllan') THEN 1  
 END) 'total'  

FROM statistics


1 commentaires

Une alternative aurait été de changer ELSE 0 en ELSE NULL dans la version originale COUNT. Ou supprimez-le car ELSE NULL est déjà implicite. :)



1
votes

Vous n'avez pas besoin d'ajouter la partie ELSE :

SELECT COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 END) AS itemtype,
       COUNT(CASE WHEN location IN ('Lattlast','Appelhyllan') THEN 1 END) AS location,
       COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 
                  WHEN location IN ('Lattlast','Appelhyllan') THEN 1  
             END) AS total
FROM statistics;


0 commentaires

1
votes

Je pense que la troisième condition serait comme ci-dessous

SELECT
COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') OR location IN ('Lattlast','Appelhyllan') THEN 1 END) AS total
FROM statistics;


0 commentaires

1
votes

COUNT compte les valeurs non nulles, ce qui signifie qu'il "compte" également le 0 de la partie ELSE . Supprimez complètement la partie ELSE:

SELECT 
  COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 END) 'itemtype',
  COUNT(CASE WHEN location IN ('Lattlast','Appelhyllan') THEN 1 END) 'location',
  COUNT(CASE WHEN itemtype IN ('BARNTAL','STORSTIL') THEN 1 
             WHEN location IN ('Lattlast','Appelhyllan') THEN 1
        END) 'total'  
FROM statistics


0 commentaires