根据表

时间:2018-10-12 07:24:38

标签: sql sql-server database tsql sql-server-2008

我有一个这样的表#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

每次仅在表中插入两个值(value1,value2,value3,value4中只有两列)
我只想根据主值选择两个值。
如果我的主要值是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 :(得分:2)

请在以下情况下尝试使用情况

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

答案 1 :(得分:2)

我不确定您使用的是哪个数据库,无论如何对于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         

如果数据库中有null而不是0,则不需要nullif函数。希望对您有所帮助。

答案 2 :(得分:0)

您需要类似的东西吗? (可以改进)

create table ABC.t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY ( START with 1 INCREMENT by 1 ),
    c2 VARCHAR2(10)
    )

答案 3 :(得分:0)

您可以使用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