2017-05-31 45 views
1

我有一個垂直存儲數據的表,我已經展示了下面這對於每個城市的記錄客戶已生活在一個簡單的例子:訪問SQL - 返回唯一組合在現場

| CUSTOMER |  CITY  | 
------------------------------ 
| John | London  | 
| John | Manchester | 
| Sarah | Cardiff | 
| Sarah | Edinburgh | 
| Sarah | Liverpool | 
| Craig | Manchester | 
| Craig | London  | 

我想想出一個返回所有城市獨特組合的SQL查詢,在上面的例子中,約翰和克雷格都住在倫敦和曼徹斯特,但莎拉住在不同的城市(加的夫,愛丁堡和利物浦),所以我想輸出如下(可處理任意數量的城市)

| CITY1 |  CITY2  |  CITY3 | 
-------------------------------------------- 
| London | Manchester |    | 
| Cardiff | Edinburgh | Liverpool | 

我一直在使用交叉表查詢,以平視的數據是這樣的嘗試:

TRANSFORM Max(City) 
SELECT Customer 
FROM tblCities 
GROUP BY Customer 
PIVOT City 

,但它只是返回現場的所有城市爲每一位顧客。有誰知道這是否可以使用SQL?

p.s理想情況下它會忽略城市的秩序

+1

如果一個人只生活在一個城市或三個城市,會發生Wbat嗎? –

+0

好問題,我希望最好的辦法是爲大多數城市的人提供足夠的專欄,而少於這個數字的人只能填寫第一個,然後填充多個專欄。 – Leroy

+0

使用外選擇不同的變換?'(客戶TRANSFORM MAX(市) 選擇客戶 FROM tblCities 集團 PIVOT市)選擇不同的*從B'? – xQbert

回答

1

這是一個很好的挑戰!下面的查詢獲取每個客戶的分組。它不會丟棄多個客戶在同一個城市組合中生活的副本......我會讓您或其他人找到解決方法。

TRANSFORM Min(OrderedList.City) AS MinOfCity 
SELECT OrderedList.Customer 
FROM (SELECT CustomerCities.Customer, CustomerCities.City, Count(1) AS CityNo 
FROM CustomerCities INNER JOIN CustomerCities AS CustomerCities_1 ON CustomerCities.Customer = CustomerCities_1.Customer 
WHERE (((CustomerCities.City)>=[CustomerCities_1].[City])) 
GROUP BY CustomerCities.Customer, CustomerCities.City) OrderedList 
GROUP BY OrderedList.Customer 
PIVOT "CITY" & [CityNo]; 
+0

這真是太棒了!謝謝史蒂夫。我敢肯定,我可以從這裏刪除重複項,這是一個很好的幫助 – Leroy

+1

如果我想到一個很好的方法來做到這一點,我會更新我的答案,但開始你可以簡單地將該代碼保存爲一個查詢,然後編寫第二個查詢,在不包含客戶字段的情況下執行「select distinct」。這不是很好,因爲你可以有效地將城市數量「硬編碼」到外部查詢中......儘管在需要時可以很容易地進行調整。 –

1

這是你想要的嗎?

select distinct c1.city, c2.city 
from tblCities as c1 inner join 
    tblCities as c2 
    on c1.customer = c2.customer and c1.city < c2.city; 

這將返回出現給任何單個客戶的所有城市對。

+0

感謝您的回覆。我的道歉,我沒有解釋得很好,但它並不總是隻是對,但可以是任何數量的城市。我編輯了我的問題,希望能夠更清楚 – Leroy

1

這裏是一個可能的工作假設每個客戶只與兩個城市相關的查詢:

SELECT DISTINCT t.city_1, t.city_2 
FROM 
(
    SELECT MIN(CITY) AS city_1, MAX(CITY) AS city_2 
    FROM tblCities 
    GROUP BY CUSTOMER 
) t 
+0

感謝您的回覆。我的道歉,我沒有解釋得很好,但它並不總是隻是對,但可以是任何數量的城市。我已經編輯了我的問題,希望能夠讓它更清晰 – Leroy