2014-02-09 7 views
0

здесь приведен пример таблицы:как получить имя столбца Макс

Create table #TableA (ID INT 
          , [1] DECIMAL(6,5) 
          ,[1.1] DECIMAL(6,5) 
          , [2] DECIMAL(6,5) 
          ,[2.2] DECIMAL(6,5) 
          , [3] DECIMAL(6,5) 
          ,[3.3] DECIMAL(6,5) 
          , [4] DECIMAL(6,5) 
          ,[4.4] DECIMAL(6,5) 
          , FLAGB1 CHAR(1) 
          , FLAGB2 float) 
INSERT INTO #TABLEA (ID, [1],[1.1],[2],[2.2],[3],[3.3],[4],[4.4],FLAGB1,FLAGB2 ) 
VALUES(1, 1.1111,null, 2.2222,0.1234, 3.3333,null,null, 1.4444,'y',null) 
     , (2, null,1.2345, 2.2345,null, 3.2345, 4.2345,1.5437,0.2378,null,null) 
     ,(3, 5.3789,1.2222,0.23864,null, 2.2222, 3.2222, 4.2222,null,'y',null) 
Drop #TableA 

мне нужна колонка FLAGB2, чтобы получить «MAX» колонки-имена, если FLAGB1 является «Y». Извинения, я не мог бы поставить требование в предложении (ы) более четко, поэтому результат должен выглядеть следующим образом:

> [ID] [1]  [1.1] [2]  [2.2] [3]  [3.3] [4]  [4.4] [FLAGB1] [FLAGB2] 
> 1  1.11110 NULL 2.22220 0.12340 3.33330 NULL NULL 1.44440 y   4.4 
> 2  NULL 1.23450 2.23450 NULL 3.23450 4.23450 1.54370 0.23780 NULL  NULL 
> 3  5.37890 1.22220 0.23864 NULL 2.22220 3.22220 4.22220 NULL  y   4 

ответ

1

К сожалению, SQL Server не имеет greatest() функцию. Вы можете сделать это больно с case утверждением:

update #tableA 
    set flagB2 = (case when [1] >= [1.1] and [1] >= [2] and [1] >= [2.2] and 
          [1] >= [3] and [1] >= [3.3] and [1] >= [4] and [1] >= [4.4] 
         then 1 
         when [2] >= [1] and [2] >= [1.1] and and [2] >= [2.2] and 
          [2] >= [3] and [2] >= [3.3] and [2] >= [4] and [2] >= [4.4] 
         then 2 
         . . . 
        end) 
    where flagB1 = 'y'; 

Этот тип структуры данных приводит меня подозревать, что столбцы [1] - [4.4] связаны. Это обычно означает, что вы должны иметь таблицу объединения/соединения с одной строкой на id и одну строку для каждого из этих значений. Запрос будет намного проще писать с использованием этой структуры данных.

+0

это не сработает, потому что фактическая таблица имеет около 60 столбцов. Просто для того, чтобы это было ясно, не имеет ничего общего со значениями столбцов. его сам столбец, который должен быть самым высоким (кроме нулей), если на FLAB1 есть «Y». FLAGB2 должен быть заполнен именами столбцов [4.4] и [4] независимо от его значений строк. – sql84

+0

@sqlsean. , , Он будет работать, он просто делает очень длинный запрос. Однако ваше требование еще больше усиливает мое мнение о том, что эта информация должна быть в таблице объединения/соединения. –

+0

Извините, может быть, я не был ясен ... я не хочу, чтобы имена столбцов имели наибольшее значение под ним. Мне нужен FLAGB2, чтобы получить имена столбцов с любым значением под ним (кроме null), но сам по себе является самым высоким, чем другие столбцы, а также имеет «Y» для FLAGB1 ........ имена столбцов пришли из конкатенации двух разные столбцы образуют две разные таблицы ... если это то, что вы имели в виду по таблице соединений? – sql84

0

Ниже перечислены изменения в схеме таблиц. Похоже, вы можете использовать некоторую терпимость, основанную на том, что вы показали. Я пошел с курсором, так как не мог использовать функции отражения сервера в «сырой» инструкции обновления. Но я думаю, что это улучшает жесткое кодирование столбцов в скрипте.

CREATE TABLE #TableA (
    ID int PRIMARY KEY, 
    [1] DECIMAL(6,5), 
    [1.1] DECIMAL(6,5), 
    [2] DECIMAL(6,5), 
    [2.2] DECIMAL(6,5), 
    [3] DECIMAL(6,5), 
    [3.3] DECIMAL(6,5), 
    [4] DECIMAL(6,5), 
    [4.4] DECIMAL(6,5), 
    FLAGB1 CHAR(1), 
    FLAGB2 float) 

INSERT INTO #TABLEA (ID,[1],[1.1],[2],[2.2],[3],[3.3],[4],[4.4],FLAGB1,FLAGB2) 
VALUES(1, 1.1111,null, 2.2222,0.1234, 3.3333,null,null, 1.4444,'y',null) 
     , (2, null,1.2345, 2.2345,null, 3.2345, 4.2345,1.5437,0.2378,null,null) 
     ,(3, 5.3789,1.2222,0.23864,null, 2.2222, 3.2222, 4.2222,null,'y',null) 

-- The following will run a separate UPDATE statement for every column having a numeric name on the #TableA temp table 

-- Get all column names from the temp table (thus tempdb's INFORMATION_SCHEMA) that are numeric and put them in a new temp table, #columns 
SELECT Column_Name 
INTO #columns 
FROM tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME LIKE '#TableA%' 
    AND ISNUMERIC(Column_Name) = 1 

DECLARE @column_name varchar(80) 

-- Create a cursor to loop through the contents of #columns 
DECLARE cur_columns CURSOR FOR 
    SELECT 
    Column_Name 
    FROM 
    #columns 
    ORDER BY 
    CONVERT(decimal, Column_Name) 

OPEN cur_columns 
FETCH NEXT FROM cur_columns INTO @column_name 

-- For each numeric column name... 
WHILE(@@FETCH_STATUS = 0) 
BEGIN 
    DECLARE @SQL varchar(max) 

    -- Build an UPDATE statement dynamically 
    -- Update the FLAGB2 column with the column name for this iteration given the value in that column is not null and FLAGB1 is either 'y' or 'Y' 
    SET @SQL = ' 
    UPDATE #TableA SET 
     FLAGB2 = ' + @column_name + ' 
    WHERE 
     ' + QUOTENAME(@column_name) + ' IS NOT NULL 
     AND UPPER(FLAGB1) = ''Y''' 

    -- Execute the UPDATE statement 
    EXEC(@SQL) 

    FETCH NEXT FROM cur_columns INTO @column_name 
END 

CLOSE cur_columns 
DEALLOCATE cur_columns 

SELECT * FROM #TableA 
+0

привет, спасибо за ввод, но ваш запрос ничего не делает, мои знания очень ограничены в отношении курсоров, после выполнения вашего запроса он не обновляет таблицу! я что-то упускаю? можете ли вы дать мне больше инструкций, чтобы сделать эту работу? – sql84

+0

Действительно ли вы используете временную таблицу или она постоянна? – Zec

+0

его таблица temp – sql84

Смежные вопросы