Quelle est la meilleure façon de sélectionner la valeur minimale à partir de plusieurs colonnes?

D'après 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 de les écrire la requête qui donne le résultat suivant (c'est à dire celui qui donne de la finale de la colonne, une colonne contenant le minium valeurs de Col1, Col2, et le 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

Mise à JOUR:

De clarification (comme je l'ai dit dans les commentaires) dans le scénario réel de la base de données est correctement normalisé. Ces "array" les colonnes ne sont pas dans une table réelle, mais sont dans un jeu de résultats qui est requis dans un rapport. Et la nouvelle exigence est que le rapport a aussi besoin de ce MinValue colonne. Je ne peux pas changer le résultat sous-jacent défini et, par conséquent, j'étais à la recherche de T-SQL pour une pratique de "sortir de prison carte".

J'ai essayé le CAS de l'approche mentionnée ci-dessous et il fonctionne, mais il est un peu lourd. Il est aussi plus compliqué qu'indiqué dans les réponses parce que vous avez besoin pour répondre au fait qu'il y a deux min les valeurs de la même ligne.

De toute façon, je pensais que je poste ma solution actuelle qui, compte tenu de mes contraintes, fonctionne assez bien. Il utilise le UNPIVOT opérateur:

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 vais le dire d'avance que je ne vous attendez pas à offrir les meilleures performances, mais étant donné les circonstances (je ne peux pas la refonte de toutes les demandes juste pour la nouvelle MinValue colonne exigence), il est un très élégant "sortir de prison carte".

  • À mon humble avis l'auteur UNPIVOT solution est supérieure à l'autre des réponses.
  • - Je trouver du Nizam solution pour être le plus mince de solution, même si il m'a fallu un certain temps pour commencer à le comprendre. Maigre et très utilisable.
InformationsquelleAutor stucampbell | 2008-12-15