我有一個表:Employee
MySQL的組
columns:
1. id
2. name
3. city1
4. city2
欲GROUP BY
city1
的和city2
組合,使得例如
- 與city1僱員:
'Bangalore'
和城2:'Chennai'
- 並用city1另一僱員:
'Chennai'
和城2:完成GROUP BY
當'Bangalore'
進來一個組。
幫我構建這個sql。
我有一個表:Employee
MySQL的組
columns:
1. id
2. name
3. city1
4. city2
欲GROUP BY
city1
的和city2
組合,使得例如
'Bangalore'
和城2:'Chennai'
'Chennai'
和城2:完成GROUP BY
當'Bangalore'
進來一個組。
幫我構建這個sql。
最簡單的方法是使用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
子句中的列別名。首先是主要原因。如果列別名與表中的名稱不同,那麼替代形式就可以。否則,我認爲代碼很混亂,因此不易維護,更容易出錯。
一個很好的教訓。 –
我認爲小組應該包含一個最大的(city1,city2)而不是2個最小的()。 –
@Harshil。 。 。謝謝。 –
您可以使用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;
這是不安全的,例如城市(「AB」,「C」)和(「A」,「BC」),都將獲得密鑰「ABC」。如果你想要連接,你需要一個不在任何城市名稱中使用的分隔符。 – maraca
並沒有任何意義,你'集團的身份證,名稱'那些人數將爲1每個員工 –
@maraca你是對的! :S –
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
你必須解釋更多的聚合點,顯示更多的數據和慾望輸出。什麼意思'來自一個團體' –