2017-09-25 14 views
0

enter image description here次のデータを持つテーブルがあります。テーブルから最大と最小のカラムを取得しようとしています。もしそれが1つのカラムであれば、カラムのmax/minを使うことができますが、ここではテーブルのすべてのカラムを比較しています。私が必要とするのは、最大値と最小値を格納する新しい列を追加することです。テーブル内のカラムの最大値と最小値

create table 
#test (column1 int, column2 int , column3 int , column4 int ,column5 int,column6 int) 

insert into #test 
values(89, 103,87,67,86,56) 

select * from #test 

--drop table #test 

おかげ予めテーブルに一つだけの行が存在することになります。

+0

シーケンスをアンピボットすることができます(https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx)。次に最大/最小 – Jeremy

答えて

2

これを行う最も簡単な方法は、列の最小/最大値をクロス適用することです。たとえば、次のように

SELECT * 
FROM #test t 
CROSS APPLY (
    SELECT MAX(val), MIN(val) 
    FROM (VALUES (t.column1), (t.column2), (t.column3), (t.column4), (t.column5), (t.column6)) AS c(val) 
) AS c(maxvalue, minvalue); 
0

データをアンピボットするVALUESメソッドを使用して、それはきれいな構文のために作るだろうが、それはパフォーマンスにコストが付属していません(ないひどいが、それはそこにある)reaggravating。 CASE式を使用すると、列のそこに多くが評価される場合は特に、もう少し面倒はなく、構文部門であるが、あなたは、同じパフォーマンスの低下を発生しません...

SELECT 
    t.column1, t.column2, t.column3, t.column4, t.column5, t.column6, 
    MinValue = CASE 
        WHEN t.column1 <= t.column2 AND t.column1 <= t.column3 AND t.column1 <= t.column4 AND t.column1 <= t.column5 AND t.column1 <= t.column6 THEN t.column1 
        WHEN t.column2 <= t.column1 AND t.column2 <= t.column3 AND t.column2 <= t.column4 AND t.column2 <= t.column5 AND t.column2 <= t.column6 THEN t.column2 
        WHEN t.column3 <= t.column1 AND t.column3 <= t.column2 AND t.column3 <= t.column4 AND t.column3 <= t.column5 AND t.column3 <= t.column6 THEN t.column3 
        WHEN t.column4 <= t.column1 AND t.column4 <= t.column2 AND t.column4 <= t.column3 AND t.column4 <= t.column5 AND t.column4 <= t.column6 THEN t.column4 
        WHEN t.column5 <= t.column1 AND t.column5 <= t.column2 AND t.column5 <= t.column3 AND t.column5 <= t.column4 AND t.column5 <= t.column6 THEN t.column5 
        ELSE t.column6 
       END, 
    MaxValue = CASE 
        WHEN t.column1 >= t.column2 AND t.column1 >= t.column3 AND t.column1 >= t.column4 AND t.column1 >= t.column5 AND t.column1 >= t.column6 THEN t.column1 
        WHEN t.column2 >= t.column1 AND t.column2 >= t.column3 AND t.column2 >= t.column4 AND t.column2 >= t.column5 AND t.column2 >= t.column6 THEN t.column2 
        WHEN t.column3 >= t.column1 AND t.column3 >= t.column2 AND t.column3 >= t.column4 AND t.column3 >= t.column5 AND t.column3 >= t.column6 THEN t.column3 
        WHEN t.column4 >= t.column1 AND t.column4 >= t.column2 AND t.column4 >= t.column3 AND t.column4 >= t.column5 AND t.column4 >= t.column6 THEN t.column4 
        WHEN t.column5 >= t.column1 AND t.column5 >= t.column2 AND t.column5 >= t.column3 AND t.column5 >= t.column4 AND t.column5 >= t.column6 THEN t.column5 
        ELSE t.column6 
       END 
FROM 
    #test t; 

結果...

column1  column2  column3  column4  column5  column6  MinValue MaxValue 
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
89   103   87   67   86   56   56   103 
0

この解決策が見つかりました。here

SELECT 
    column1 
    ,column2 
    ,column3 
    ,column4 
    ,column5 
    ,column6 
    ,(SELECT MAX(MaxValue) 
     FROM (VALUES (column1),(column2),(column3), (column4), (column5), (column6)) AS [Values](MaxValue)) 
    AS MaxValue 
    ,(SELECT MIN(MinValue) 
     FROM (VALUES (column1),(column2),(column3), (column4), (column5), (column6)) AS [Values](MinValue)) 
    AS MinValue 
FROM #test 
関連する問題