我有一张桌子:Employee
columns:
1. id
2. name
3. city1
4. city2
我希望GROUP BY
city1
和city2
的组合,以便{...}
'Bangalore'
和city2:'Chennai'
'Chennai'
和city2:'Bangalore'
GROUP BY
后,会出现在一个组中。
帮我构建这个sql。
答案 0 :(得分:3)
最简单的方法是使用least()
和greatest()
:
select least(city1, city2) as city1, greatest(city1, city2) as city2, count(*)
from employees
group by least(city1, city2), greatest(city1, city2);
如果您有NULL
值,逻辑会稍微复杂一些。问题没有说明NULL
值。
注意:
编辑此答案时使用:
group by city1, city2
虽然技术上正确,但我删除了编辑有两个原因:
city1
和city2
不明确,因为它们都是数据和列别名中列的名称。group by
子句中的列别名。首先是主要原因。如果列别名与表中的名称不同,那么替代配方就可以了。否则,我认为代码混乱,因此可维护性较差,更容易出错。
答案 1 :(得分:1)
您可以使用CASE WHEN
;
SELECT
CityKey,
Id,
Name,
count(CityKey)
FROM
(SELECT
CASE WHEN City1 > City2 THEN Concat(City1,City2)
WHEN City1 <= City2 THEN Concat(City2,City1)
END AS CityKey,
Sample.City1,
Sample.City2,
Id,
name
FROM SAMPLE) WithKeys
GROUP BY CityKey, Id, Name;
答案 2 :(得分:1)
SELECT city, count(*)
FROM
(
SELECT e.*,
if(e.city1 < e.city2,
concat(city1,'-', city2),
concat(city2,'-', city1)) as city
FROM employee
) T
GROUP BY city