如果然后在T-SQL

问题描述:

我正在使用T-SQL中的数据库,现在我有一个问题。如果然后在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的行,乔恩的200

+3

而不是谈论我行会显示样本数据和期望的结果。 – 2013-03-26 21:57:44

+2

你到目前为止尝试过什么?另外,谷歌的第一个结果是“tsql if then”http://msdn.microsoft.com/en-us/library/ms182587.aspx – 2013-03-26 21:58:41

+0

OK,DB有 name,doc,sum; tom,0,100; tom,2000,200; jon,2000,200; 现在我希望得到TOM值为100的行,JON的值为200. 我的数据库有大约500000行,这就是为什么我没有给出任何确切的东西。 Sry – tljubas 2013-03-26 22:01:07

假设你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 

该版本使用窗口函数来计算每个名称的零值的行数。然后使用问题中的逻辑选择值为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 

的一种方式,在CTE使用ROW_NUMBER

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(与你的样本数据)