SQL显示顺序,其中2个值是不同的并且与第一个值匹配

时间:2018-07-30 19:07:02

标签: sql sql-server-2008-r2

我正在寻找一种方法,让我选择在同一订单号中具有多个不同名称的所有订单,如下所示:

order - name
111-Paul
112-Paula 
113-John
113-John
113-Jessica 
114-Eric
114-Eric
114-John
115-Zack
115-Zack
115-Zack

这样我就可以得到所有具有2个或更多不同名称的订单:

113-John
113-Jessica
114-Eric
114-John

我可以用它做进一步的查询,但是我被卡住了。有人可以给我一些如何解决这个问题的提示吗?我已经用count(*)尝试过了,它看起来像这样:

select order, name, count(name) from dbo.orders
group by order, name
having count(name) > 1

这给了我所有名称超过1个的订单,但我不知道如何让它只显示具有不同名称的订单。

6 个答案:

答案 0 :(得分:3)

这是使用exists的一种方法:

select distinct [order], name 
from orders o
where exists (
  select 1 
  from orders o2
  where o.[order] = o2.[order] and o.name != o2.name)

答案 1 :(得分:0)

我会为此使用Windows函数

例如:

select distinct order 
from 
    (select 
         order, 
         row_number() over(partition by order, name order by order asc) as rn
    ) as t1 
where rn > 1

您可以对count做同样的事情

count(*) over(partition by order,name order by order asc) as cnt

答案 2 :(得分:0)

Here's a straight forward implementation in Sql Server

select distinct *
from table1
where [order] in (
    select [order]
    from (select distinct * from table1) iq
    group by [order]
    having count(*) > 1)

这实际上是将问题分解为:

  1. 查找具有多个不同值的订单。

  2. 查找不同顺序的对-属于先前计算的列表的名称。

答案 3 :(得分:0)

使用HAVING COUNT(name) > 1时,它会计算那些组中的所有行,包括重复的行(行113-John和113-John是订单113的2行)。我将查询表中不同的行,然后从中选择:

SELECT [order], [name] FROM (
    SELECT DISTINCT [order], [name] FROM dbo.orders
) A
GROUP BY [order], [name]
HAVING COUNT([name]) > 1

请注意,如果[名称]为null,则不会将其计入COUNT(name)中。如果要计算空值,请改用COUNT(*)

答案 4 :(得分:0)

您可以使用count(distinct name)来获取每个订单的唯一名称的数量:

select [order], count(distinct name)
from orders
group by [order]

要获取订单,可以使用having

select [order]
from orders
group by [order]
having count(distinct name) > 1

要获取这些订单的详细信息,可以将其放在where子句中,以仅返回该列表中带有order的行:

select *
from orders
where [order] in (
  select [order]
  from orders
  group by [order]
  having count(distinct name) > 1
)

sqlfiddle

答案 5 :(得分:0)

我将为此使用RANK(或DENSE_RANK)。

Repository

子查询根据名称的值对名称进行排序(提供种子)。具有相同值的名称将具有相同的排名,即,当一个订单多次具有一个名称(例如115)时,所有名称的排名将为1。

分区在这里很重要,因为否则您将获得所有订单的所有名称的排名,而这不会给您想要的结果。

然后只是撤出RANK大于1的订单并进行分组(如果这是首选项,可以使用distinct)的情况。

然后您可以加入该表以获取如下的订单和名称;

SELECT [Order]
FROM (SELECT 
        [Order],
        RANK() OVER(PARTITION BY [Order] ORDER BY Name) AS NameRank
      FROM [StackOverflow].[dbo].[OrderAndName]) ranked
WHERE ranked.NameRank > 1
GROUP BY [Order]