2

在一个表格中,我们有学校的数据:

 ID | Name | City
------------------  
  1    A     X          
  2    B     X    
  3    C     Z
  4    D     Z

我想列出同一城市的每两所学校:

Name1 | Name2
--------------  
  A      B          
  C      D    

我选择了同城的学校:

 SELECT Name FROM Schools
    Group by City
    Having City = City

这是对的吗?如何将 2 个匹配的学校放在一张新桌子上?

谢谢

4

3 回答 3

4

更新另一种方法

如果您坚持分组,一种方法是

SELECT City,
       MIN(Name) Name1,
       MAX(Name) Name2
  FROM Schools
 GROUP BY City
-- HAVING COUNT(*) > 1

另一种方式

SELECT City,
       MIN(CASE WHEN rnum = 1 THEN Name END) Name1,
       MIN(CASE WHEN rnum = 2 THEN Name END) Name2
  FROM
(
  SELECT s.*, ROW_NUMBER() OVER (PARTITION BY City ORDER BY Name) rnum
    FROM Schools s
) q
 GROUP BY City

样本输出:

| 城市 | 姓名1 | 名称2 |
----------------------
| X | 一个 | 乙|
| Z | C | D |

这是SQLFiddle演示

于 2013-08-13T22:01:12.367 回答
1
SELECT a.Name, b.Name
FROM Schools a JOIN Schools b ON a.City = b.City 
          AND a.ID != b.ID 
          AND a.Name < b.Name;

这将返回同一城市中的所有学校对,而不仅仅是每个城市的一对。

于 2013-08-13T22:07:22.290 回答
0

如果一个城市包含超过 2 所学校,则以下查询不能保证将返回哪 2 所学校:

SELECT      S1.Name,
            S2.Name
FROM        (
                SELECT      MIN(ID) ID,
                            City
                FROM        @Schools
                GROUP BY    City
            ) S
INNER JOIN  @Schools S1 ON S.ID = S1.ID
INNER JOIN  @Schools S2 ON ( S.City = S2.City AND S.ID != S2.ID )
于 2013-08-13T21:59:40.383 回答