Postgresql GROUB BY组合

时间:2017-08-09 08:48:52

标签: postgresql group-by

如果我之间有组合,

,我对group by子句有疑问

这是我的表格中的一部分:

CREATE TABLE sampleTable 
    (
     id serial primary key, 
     sat1 varchar(3), 
     sat2 varchar(3)
    );

INSERT INTO sampleTable
(sat1, sat2)
VALUES
('LE7','LE7'),
('LE8','LE7'),
('LE7','LE7'),
('LE7','LC8'),
('LE7','LE8'),
('LE8','LE7'),
...

http://sqlfiddle.com/#!15/63104/2

我搜索组合的数量,但对我来说,组合sat1,sat2与sat2,sat1相同。

我的(错误的)SQL代码:

select sat1, sat2, count(*) from sampleTable group by sat1, sat2 order by sat1

结果:

    sat1    sat2    count
1   LC8     LC8     27
2   LC8     LE7     17
3   LE7     LE7     200
4   LE7     LC8     22
5   LM1     LM2     2
6   LM1     LM1     12
7   LM2     LM2     6
8   LM2     LM1     3

但应该通过:

    sat1    sat2    count
1   LC8     LC8     27
2   LC8     LE7     39  (17+22 / line 2 & 4)
3   LE7     LE7     200
4   LM1     LM2     5   (2+3 / line 5 & 8)
5   LM1     LM1     12
6   LM2     LM2     6

有没有一个SQL代码可以解决我的问题? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

使用LEAST()和GREATEST()来简化"简化" 2个分组列:

查询1

select least(sat1, sat2), greatest(sat1, sat2), count(*) 
from sampleTable 
group by least(sat1, sat2), greatest(sat1, sat2)
order by least(sat1, sat2)

<强> [结果] [2]

| least | greatest | count |
|-------|----------|-------|
|   LC8 |      LC8 |    27 |
|   LC8 |      LE7 |    39 |
|   LE7 |      LE7 |   200 |
|   LM1 |      LM1 |    12 |
|   LM1 |      LM2 |     5 |
|   LM2 |      LM2 |     6 |

请参阅此SQL Fiddle