2017-02-03 17 views
1

悪質なタイトルで申し訳ありません。私は自分の問題をより良く表現する方法を考えることができませんでした。ミラーリングされた値を含む列を持つSQL GROUP BY

私は、次の表を持っている:

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 

しかし、明らかに、私は、次のエラーを取得:

列それはどちらかのANに が含まれていないため、「」選択リストに無効です集計関数またはGROUP BY句を使用します。

列 'b'は、 集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストで無効です。

希望する結果を得るにはどうすればよいですか?

+0

あなたの予想出力はもう少し説明できますか?なぜA = 1、4が維持され、2、3が削除されたのでしょうか?あなたはそれぞれのカテゴリーごとに1つの行を保持したいですか? – GurV

+0

表示したいaとbの値を選択する基準は何ですか? – Simon

+0

Aカテゴリの3つの行がある場合、このカップル{5,5}の結果はどのようなものになりますか? –

答えて

3

を使用して1つのトリックは、この試してみてくださいです:値がミラーリングされている場合、あなたはMINを使用して両方の値を取得することができます

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

を、MAXは上の適用しました単一の列、例えばa

+2

これは予想される出力を生成しません(これは意味をなさないかもしれません)。 –

+0

これは、列aおよび列bからの出力を提供しておらず、またどの値が返されるかの問題も解決していません。 – Simon

+0

@Simon実際には、これは実際にOPが望むものかもしれませんが、期待される出力とは一致しません。 –

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 
3

Seamは、カテゴリごとに集計するのではなく、結果から重複した行(重複と思われる行)を削除します。

ペア(x、y)をペア(y、x)と同じと見なします。重複を見つけるには、第二で1位と大きいに低い値を配置し、行に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; 
+0

興味深いロジックスイッチですが、ミラーリングされていない –