【问题标题】:Select 2 records which were grouped, Then put them in 2 columns along side选择 2 条已分组的记录,然后将它们放在旁边的 2 列中
【发布时间】:2013-08-13 21:33:53
【问题描述】:

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

 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 个匹配的学校放在一张新桌子上?

谢谢

【问题讨论】:

  • 每个城市可以有两所以上的学校吗?如果是,结果应该是什么?
  • 您使用的是什么 RDBMS(MySql、SQL Server、Oracle 等)?
  • @Leigh 是的。我也想知道它会怎样。在这种情况下,多列与相同的城市一样多。

标签: sql sql-server database pivot


【解决方案1】:

更新另一种方法

如果你坚持分组的一种方法

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演示

【讨论】:

  • 这些MINMAX 在这里究竟做了什么?
  • 他们每组抓取两个值。一个在一组中具有最小值,另一个具有最大值。
  • 中间值呢?这是因为我们只想要一对结果吗?如果是,这是唯一的方法吗?
  • 他们呢?在您的问题中,您说您需要 两所 匹配的学校。查看更新的答案,了解另一种做同样事情的方法。
  • 不客气 :) 第一种方法的问题是,如果每个城市只有一个名称,您将获得相同的 Name1Name2HAVING COUNT(*) > 1 过滤掉每个城市只有一个名称的行。因此,由您决定它是否有用,因为您的问题中没有足够的信息来说明您想要使用此查询的上下文。
【解决方案2】:
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;

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

【讨论】:

    【解决方案3】:

    如果一个城市包含超过 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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2018-05-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多