SQL GROUP BY,其中包含包含镜像值的列

时间:2017-02-03 14:52:05

标签: sql-server group-by aggregate

抱歉标题不好。我无法想出一个更好的方式来描述我的问题。

我有下表:

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

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

所以结果应该是这样的:

category | resultA | resultB
A        | 1       | 2
B        | 4       | 3

如何实现这一目标?

我试过这句话:

SELECT category, a, b
FROM table
GROUP BY category

但很明显,我收到以下错误:

  

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

     

专栏' b'在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

如何达到预期效果?

3 个答案:

答案 0 :(得分:3)

试试这个:

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

如果镜像了这些值,那么您可以使用MINMAX应用于a等单个列来获取这两个值。

答案 1 :(得分:3)

您不希望按类别聚合,而是从结果中删除重复的行(或者您认为重复的行)。

您认为一对(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;

答案 2 :(得分:2)

考虑到您希望每个category的重复项都有随机记录。

这是使用表值构造函数和Row_Number窗口函数

的一个技巧
;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