按顺序返回不同的优先级排序结果

时间:2014-09-26 03:42:35

标签: sql sql-server-2008

Name varchar, Value int, Active bit
-----------------------------------
'Name1',1,1
'Name2',2,1
'Name1',3,0
'Name2',4,0
'Name3',1,1
'Name4',1,1

我想返回Active是什么,但在0时优先考虑,所以我想返回这个:

'Name1',3
'Name2',4
'Name3',1
'Name4',1

我试过这个,但是在我的返回语句

中包含Active会出错
Select Distinct Name, Value From Table Order by Active

所以我尝试了这个:

Select Distinct Name, Value, Active From Table Order by Active

但现在它返回所有行。我想在不同的结果中优先考虑where Active = 0,但由于它要求我在return语句中放置Active会使这变得复杂。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

您的问题有点令人困惑,但如果我理解正确,您需要使用group by声明:

select name,
  max(case when active = 0 then value end) value
from yourtable
group by name

通过编辑,您可以使用coalesce并仍然可以使用它:

select name, coalesce(max(case when active = 0 then value end), max(value)) value
from yourtable
group by name

答案 1 :(得分:0)

您可以按照select子句中未包含的字段进行排序

Select Name, Value 
From Table
ORDER BY Active, Name, Value

但你不能同时使用SELECT DISTINCT

如果你使用"选择不同的"有些行可能会被丢弃,当发生这种情况时,[Active]和" distinct"之间不再存在任何可行的关系。行。因此,如果使用select distinct,并且需要按[Active]排序,那么[Active]必须在select子句中。

答案 2 :(得分:0)

也许这就是:

create table #t(
    Active int         not null,
    Name   varchar(10) not null,
    Value  int         not null,

    primary key clustered (Active desc,Name,Value)
);

insert #t(Active,Name,Value)
select Active,Name,Value from [Table];

select Name, Value
from #t;
go

根据需要产生:

Name       Value
---------- -----------
Name1      1
Name2      2
Name3      1
Name4      1
Name1      3
Name2      4

答案 3 :(得分:0)

我无法删除其他答案的帖子b / c,但这里是我正在寻找的答案,以防其他人想知道。

    SELECT Distinct Name,Value FROM Table WHERE Active = 0     UNION ALL     SELECT Distinct Name,Value FROM Table a WHERE Active = 1 AND NOT EXISTS(         SELECT TOP 1 1 FROM表a2 WHERE a2.Active = 0 AND a2.Name = a.Name     )

回顾@Sgeddes的答案以获得更好的解决方案。

感谢大家的帮助。