2012-08-27 1 views
3

J'ai une table qui ressemble siSQL ORDER BY deux colonnes, selon le plus élevé

ITEM_NAME  | NUM_SOLD | NUM_VIEWS 
Apple   |  50 |  75 
Orange  |  40 |  85 
Pear   |  80 |  70 
Cherry  |  15 |  60 

Je veux régler ce problème par si ce chiffre est le plus élevé dans soit des deux dernières colonnes.

Ainsi, le tableau ci-dessus serait réglé comme ceci:

ITEM_NAME  | NUM_SOLD | NUM_VIEWS 
Orange  |  40 |  85 
Pear   |  80 |  70 
Apple   |  50 |  75 
Cherry  |  15 |  60 

Vous pouvez voir que les chiffres que je coups de poing, ils sont pour la plupart classés par NUM_VIEWS, mais parce que Pear a une valeur supérieure à NUM_SOLD soit des valeurs de Apple, il est trié entre Orange et Apple.

Cet exemple de pomme et poire est ce que je ne peux pas obtenir pour fonctionner correctement.

Répondre

0

je généralement faire avec avec une instruction IF

IF @a > @b 
BEGIN 
    SELECT Col1, Col2, ... FROM Table1 Where... ORDER BY Col1 
END 
ELSE 
BEGIN 
    SELECT Col1, Col2, ... FROM Table1 Where... ORDER BY Col2 
END 
4
order by 
case when num_sold>num_views 
    then num_sold 
    else num_views 
end 
1

Comme mentionné par d'autres utilisateurs, en utilisant la fonction GREATEST est la plus appropriée. J'ajouterais, cependant, que vous pourriez avoir besoin de COALESCE (mysql coalesce() docs) vos valeurs avec zéro si vos colonnes par défaut à NULL ou pourraient jamais contenir une valeur NULL.

C'est parce que GREATEST renverra NULL si une valeur passée est NULL (mysql greatest() docs), et affectent donc votre clause ORDER BY en appuyant sur tous ceux qui ont des valeurs NULL dans les deux colonnes au fond de votre ordre décroissant. Par défaut, si votre compte a un zéro par défaut, il sera correct, mais s'il est nul par défaut ou si vous avez besoin de cette méthode pour toute autre table avec des valeurs NULL, cela sera nécessaire. Il m'a attrapé en travaillant avec des dates qui ont souvent des valeurs par défaut NULL.

ORDER BY GREATEST(
    COALESCE(NUM_SOLD, 0), # returns the column value or zero if null 
    COALESCE(NUM_VIEWS, 0) 
) 

Note: Je n'ai pas assez de points pour mettre cela dans un commentaire, mais je me suis dit qu'il était assez précieux pour une réponse.

Questions connexes