Sql server 包含镜像值的列的SQL GROUP BY

Sql server 包含镜像值的列的SQL GROUP BY,sql-server,group-by,aggregate,Sql Server,Group By,Aggregate,对不起,标题不好。我想不出更好的方式来描述我的问题 我有下表: Category | A | B A | 1 | 2 A | 2 | 1 B | 3 | 4 B | 4 | 3 我想按Category对数据进行分组,每个类别只返回一行,但同时提供列A和B的值 所以结果应该是这样的: category | resultA | resultB A | 1 | 2 B | 4 | 3 如何做

对不起,标题不好。我想不出更好的方式来描述我的问题

我有下表:

Category | A | B
A        | 1 | 2
A        | 2 | 1
B        | 3 | 4
B        | 4 | 3

我想按
Category
对数据进行分组,每个类别只返回一行,但同时提供列
A
B
的值

所以结果应该是这样的:

category | resultA | resultB
A        | 1       | 2
B        | 4       | 3
如何做到这一点

我试过这样的说法:

SELECT category, a, b
FROM table
GROUP BY category
但很明显,我有以下错误:

列“a”在选择列表中无效,因为它未包含 在聚合函数或GROUP BY子句中

列“b”在选择列表中无效,因为它不包含在 聚合函数或GROUPBY子句


如何实现所需的结果?

考虑到您希望从每个
类别的副本中随机记录

下面是一个使用表值构造函数和
行数
窗口函数的技巧

;with cte as
(
SELECT *,
       (SELECT Min(min_val) FROM (VALUES (a),(b))tc(min_val)) min_val,
       (SELECT Max(max_val) FROM (VALUES (a),(b))tc(max_val)) max_val
FROM   (VALUES ('A',1,2),
               ('A',2,1),
               ('B',3,4),
               ('B',4,3)) tc(Category, A, B) 
)
select Category,A,B from 
(
Select Row_Number()Over(Partition by category,max_val,max_val order by (select NULL)) as Rn,*
From cte
) A
Where Rn = 1

考虑到您希望从每个
类别的副本中随机记录一条

下面是一个使用表值构造函数和
行数
窗口函数的技巧

;with cte as
(
SELECT *,
       (SELECT Min(min_val) FROM (VALUES (a),(b))tc(min_val)) min_val,
       (SELECT Max(max_val) FROM (VALUES (a),(b))tc(max_val)) max_val
FROM   (VALUES ('A',1,2),
               ('A',2,1),
               ('B',3,4),
               ('B',4,3)) tc(Category, A, B) 
)
select Category,A,B from 
(
Select Row_Number()Over(Partition by category,max_val,max_val order by (select NULL)) as Rn,*
From cte
) A
Where Rn = 1
试试这个:

SELECT category, MIN(a) AS resultA, MAX(a) AS resultB
FROM table
GROUP BY category
如果镜像了这些值,则可以使用
MIN
MAX
将这两个值应用于单个列,如
a

,尝试以下操作:

SELECT category, MIN(a) AS resultA, MAX(a) AS resultB
FROM table
GROUP BY category

如果值被镜像,则可以使用<代码> min <代码>两个值,<代码> max >代码>应用于一个列,如<代码> < < /C> >

SEAM,您不想聚合每个类别,而是从结果中删除重复行(或者更确切地说,您认为重复的行)。

你考虑一对(x,y)等于对(y,x)。要查找重复项,可以将较小的值放在第一位,将较大的值放在第二位,然后对行应用

DISTINCT

select distinct
  category,
  case when a < b then a else b end as attr1,
  case when a < b then b else a end as attr2
from mytable;
选择distinct
类别
当a< /代码>  SeAMs,您不想聚合每个类别,而是从结果中删除重复行(或者更确切地说,您认为重复的行)。

你考虑一对(x,y)等于对(y,x)。要查找重复项,可以将较小的值放在第一位,将较大的值放在第二位,然后对行应用

DISTINCT

select distinct
  category,
  case when a < b then a else b end as attr1,
  case when a < b then b else a end as attr2
from mytable;
选择distinct
类别
当a
您能再解释一下您的预期输出吗?为什么A=1,4被保留,而2,3被删除?是否要为每个类别保留任何一行?选择a和b中要显示哪些值的标准是什么?如果有三行包含一个类别,那么这两行{5,5}会是什么结果?“我想按类别对数据进行分组”-你真的这样认为吗?每个类别一个结果行,无论值是什么?到目前为止,每个类别只显示一个属性对的数据(1表示A,2表示A;3表示B,4表示B)。请显示每个类别的更多记录,并告诉我们这对预期结果的影响。您能再解释一下您的预期输出吗?为什么A=1,4被保留,而2,3被删除?是否要为每个类别保留任何一行?选择a和b中要显示哪些值的标准是什么?如果有三行包含一个类别,那么这两行{5,5}会是什么结果?“我想按类别对数据进行分组”-你真的这样认为吗?每个类别一个结果行,无论值是什么?到目前为止,每个类别只显示一个属性对的数据(1表示A,2表示A;3表示B,4表示B)。请为每个类别显示更多记录,并告诉我们这将如何影响预期结果。这不会产生预期的输出(这可能毫无意义)。这不会提供a列和b列的输出,也不会解决返回哪些值的问题。@Simon实际上,我想这可能真的是OP想要的,但是它与预期的输出不匹配。@Tim OP表示他想要的是A和B的值,而不是A的最小值和最大值。不管怎样,我同意它不会在这里提供预期的输出。OP。那么最小/最大组合实际上就是我想要的。我通过另一个查询确保每个类别的可用条目不超过两个。因此,min/max将始终捕获这两个值并生成预期输出。这不会生成预期输出(当然可能没有任何意义)。这不会提供a列和b列的输出,也不会解决返回哪些值的问题。@Simon实际上,我认为这可能真的是OP想要的,但是它与预期的输出不匹配。@Tim OP表示他想要的是A和B的值,而不是A的最小值和最大值。不管怎样,我同意它不会在这里提供预期的输出。OP。那么最小/最大组合实际上就是我想要的。我通过另一个查询确保每个类别的可用条目不超过两个。因此,min/max将始终捕获这两个值并产生预期的输出。有趣的逻辑开关,但将返回非镜像逻辑开关,也将返回非镜像逻辑开关