如果然后在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
答
假设你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(与你的样本数据)
而不是谈论我行会显示样本数据和期望的结果。 – 2013-03-26 21:57:44
你到目前为止尝试过什么?另外,谷歌的第一个结果是“tsql if then”http://msdn.microsoft.com/en-us/library/ms182587.aspx – 2013-03-26 21:58:41
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