我正在研究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.
答案 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