2017-05-31 47 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