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 Réponses :
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
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. :)
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;
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;
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
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.