Выбор столбца из таблицы на основе значения, хранящегося в таблице - PullRequest
0 голосов
/ 12 октября 2018

У меня есть таблица #A, например:

id  | main_value |  value1 |  Value2 |  value3 |    value4
------------------------------------------------------------
1   | VALUE1     |  1.00   |  0.00   |  0.00   |    2.00
2   | VALUE2     |  0.00   |  4.00   |  0.00   |    0.00
3   | VALUE4     |  0.00   |  0.00   |  1.00   |    5.00
4   | VALUE3     |  1.00   |  0.00   |  2.00   |    0.00

Каждый раз, когда в таблицу вставляются только два значения (только два столбца из значения1, значения2, значения3, значения4)
Я хочу выбратьтолько два значения основаны на основном значении.
Если мое основное значение равно value1, тогда значение столбца 1st равно values1, а значением столбца 2nd является другой столбец, который не равен нулю.

Если мое основное значение value2, тогда значение столбца 1st равно values2, а значение столбца 2nd - это другой столбец, который не равен нулю.

Пример данных:

CREATE TABLE #A (id int, 
main_value Nvarchar(MAX), 
value1 DECIMAL(15,2), 
Value2 DECIMAL(15,2), 
value3 DECIMAL(15,2), 
value4 DECIMAL(15,2))

INSERT INTO #A VALUES(1, 'VALUE1',1,0,0,2 )
INSERT INTO #A VALUES(2, 'VALUE2',0,4,0,0 )
INSERT INTO #A VALUES(3, 'VALUE4',0,0,1,5 )
INSERT INTO #A VALUES(4, 'VALUE3',1,0,2,0 )

SELECT * FROM #A

Ожидаемые результаты:

id  | main_value |  1st    |  2nd    |  
--------------------------------------
1   | VALUE1     |  1.00   |  2.00   |
2   | VALUE2     |  4.00   |  1.00   |
3   | VALUE4     |  5.00   |  1.00   |
4   | VALUE3     |  2.00   |  1.00   |

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

Я не уверен, какую базу данных вы используете, в любом случае для SQL Server такое решение должно работать:

SELECT  id,
        main_value,
           COALESCE(NULLIF(value1,0)
                   ,NULLIF(value2,0)
                   ,NULLIF(value3,0)
                   ,NULLIF(value4,0)) as Value1

        , COALESCE(NULLIF(value4,0)
                   ,NULLIF(value3,0)
                   ,NULLIF(value2,0)
                   ,NULLIF(value1,0)) as Value2

FROM #A         

Если в базе данных есть нули, а не 0, то функция нуль, если не нужна.Надеюсь, это поможет.

0 голосов
/ 12 октября 2018

Вам нужно что-то подобное?(это можно улучшить)

SELECT 
    id
,   main_value
,   CASE main_value
    WHEN 'VALUE1' THEN value1
    WHEN 'VALUE2' THEN Value2
    WHEN 'VALUE3' THEN value3
    WHEN 'VALUE4' THEN value4
    END [1st]
,   CASE main_value
    WHEN 'VALUE1' THEN COALESCE(Value2,value3,value4)
    WHEN 'VALUE2' THEN COALESCE(Value1,value3,value4)
    WHEN 'VALUE3' THEN COALESCE(Value1,value2,value4)
    WHEN 'VALUE4' THEN COALESCE(Value1,value2,value3)
    END [2st]   
FROM (
SELECT
    id
,   main_value
,   CASE WHEN value1 = 0 THEN NULL ELSE value1 END value1
,   CASE WHEN Value2 = 0 THEN NULL ELSE Value2 END Value2
,   CASE WHEN value3 = 0 THEN NULL ELSE value3 END value3
,   CASE WHEN value4 = 0 THEN NULL ELSE value4 END value4
FROM #A
) D
0 голосов
/ 12 октября 2018

Вместо того, чтобы писать выражение case дважды, вы можете использовать cross apply:

SELECT  id, main_value, [1st],
        value1 + value2 + value3 + value4 - [1st] As [2nd]    
FROM #A
CROSS APPLY
(
    SELECT 
    CASE main_value  
        WHEN 'VALUE1' THEN value1
        WHEN 'VALUE2' THEN value2
        WHEN 'VALUE3' THEN value3
        WHEN 'VALUE4' THEN value4
    END As [1st]
) X
0 голосов
/ 12 октября 2018

Попробуйте ниже использовать случай, когда

select id, main_value, 
case 
when main_value='VALUE1' then value1
when main_value='VALUE2' then value2
when main_value='VALUE4' then value4
when main_value='VALUE3' then value3
end as 1st,
case 
when main_value='VALUE1' then value2+value3+value4
when main_value='VALUE2' then value1+value3+value4
when main_value='VALUE4' then value1+value2+value3
when main_value='VALUE3' then value1+value2+value4
end as 2nd
from tablename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...