0

我正在使用 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 的行。

4

3 回答 3

3

一种方法,ROW_NUMBER在 a 中使用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 

演示(使用您的示例数据)

于 2013-03-26T22:12:10.303 回答
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
于 2013-03-26T21:59:29.843 回答
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
于 2013-03-26T21:59:32.453 回答