Étant donné le tableau suivant dans SQL Server 2005 :
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
Quelle est la meilleure façon d'écrire la requête qui donne le résultat suivant (c'est-à-dire une requête qui donne la colonne finale - une colonne contenant les valeurs minimales de Col1, Col2 et Col 3) ? pour chaque ligne ) ?
ID Col1 Col2 Col3 TheMin
-- ---- ---- ---- ------
1 3 34 76 3
2 32 976 24 24
3 7 235 3 3
4 245 1 792 1
UPDATE :
Pour plus de clarté (comme je l'ai dit dans les commentaires), dans le scénario réel, la base de données est la suivante correctement normalisé . Ces colonnes "tableau" ne se trouvent pas dans un tableau réel mais dans un ensemble de résultats requis dans un rapport. Et la nouvelle exigence est que le rapport a également besoin de cette colonne MinValue. Je ne peux pas modifier l'ensemble de résultats sous-jacent et je me suis donc tourné vers T-SQL pour obtenir une carte de sortie de prison pratique.
J'ai essayé l'approche CASE mentionnée ci-dessous et elle fonctionne, bien qu'elle soit un peu lourde. Elle est également plus compliquée que ce qui est indiqué dans les réponses, car il faut tenir compte du fait qu'il y a deux valeurs minimales dans la même ligne.
Quoi qu'il en soit, j'ai pensé publier ma solution actuelle qui, compte tenu de mes contraintes, fonctionne assez bien. Elle utilise l'opérateur UNPIVOT :
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
Je dirai d'emblée que je ne m'attends pas à ce que cela offre les meilleures performances, mais compte tenu des circonstances (je ne peux pas revoir toutes les requêtes uniquement pour la nouvelle exigence de la colonne MinValue), il s'agit d'une "carte de sortie de prison" assez élégante.