如果那么在T-SQL中

时间:2013-03-26 21:56:37

标签: sql sql-server tsql

我正在研究T-SQL中的数据库,现在我遇到了问题。

我有多个具有相同名称的行,但其中一列中的值不同(一行doc为0,第二行doc为2000),有些行来了只有一次而且只有一个值。

现在,我想选择行中有0的所有那些,如果没有0,那么我想选择具有值的那个。

以下是示例数据:

CREATE TABLE Table1
    ([name] varchar(3), [doc] int, [sum] int)
;

INSERT INTO Table1
    ([name], [doc], [sum])
VALUES
    ('tom', 0, 100),
    ('tom', 2000, 200),
    ('jon', 2000, 200)
;

现在我希望获得TOM值为100的行,JON的值为200.

3 个答案:

答案 0 :(得分:3)

一种方法是在ROW_NUMBER中使用CTE

WITH cte 
     AS (SELECT [name], 
                [doc], 
                [sum], 
                [rn] = Row_number() 
                       OVER( 
                         partition BY name 
                         ORDER BY CASE WHEN doc=0 THEN 0 ELSE 1 END) 
         FROM   table1) 
SELECT [name], 
       [doc], 
       [sum] 
FROM   cte 
WHERE  rn = 1 

DEMO(包含您的示例数据)

答案 1 :(得分:0)

假设您的A列不能包含负值:

select name, min(A)
from yourtable
group by name

如果您想要上述每一行的整行,则必须使用子查询:

select yourtable.* from yourtable
join (
    select name, min(A) [mina]
    from yourtable
    group by name
) a on a.name=yourtable.name and a.[mina]=yourtable.A

答案 2 :(得分:0)

此版本使用窗口函数计算每个名称的值为零的行数。然后,它使用您问题中的逻辑选择值为0的行或具有有效值的行。

select name, value
from (select name, value,
             sum(case when value = 0 then 1 else 0 end) over (partition by name) as NumZeros
      from t
     ) t
 where numZeros = 0 or value = 0