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.