2015-11-11 18 views
1

我有一個表:EmployeeMySQL的組

columns: 
1. id 
2. name 
3. city1 
4. city2 

GROUP BYcity1的和city2組合,使得例如

  • 與city1僱員:'Bangalore'和城2:'Chennai'
  • 並用city1另一僱員:'Chennai'和城2:完成GROUP BY'Bangalore'

進來一個組。

幫我構建這個sql。

+2

你必須解釋更多的聚合點,顯示更多的數據和慾望輸出。什麼意思'來自一個團體' –

回答

2

最簡單的方法是使用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 

雖然技術上是正確的,我刪除了編輯的原因有兩個:

  1. city1city2是不明確的,因爲他們都是數據和列別名中列的名稱。
  2. 並非所有數據庫都支持group by子句中的列別名。

首先是主要原因。如果列別名與表中的名稱不同,那麼替代形式就可以。否則,我認爲代碼很混亂,因此不易維護,更容易出錯。

+0

一個很好的教訓。 –

+0

我認爲小組應該包含一個最大的(city1,city2)而不是2個最小的()。 –

+0

@Harshil。 。 。謝謝。 –

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; 
+0

這是不安全的,例如城市(「AB」,「C」)和(「A」,「BC」),都將獲得密鑰「ABC」。如果你想要連接,你需要一個不在任何城市名稱中使用的分隔符。 – maraca

+0

並沒有任何意義,你'集團的身份證,名稱'那些人數將爲1每個員工 –

+0

@maraca你是對的! :S –

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