使用GROUP BY子句用单个值替换不同的行

use*_*540 3 sql t-sql sql-server

我正在尝试做类似的事(当然是假的):

SELECT 
  city,
  CASE WHEN COUNT( [group] ) > 1 THEN 'Multiple' ELSE [group] END  AS Type 
FROM 
  offices
GROUP BY
  city
Run Code Online (Sandbox Code Playgroud)

办公室包含以下行:

ID |   group   |  city
----------------------
1  |    'A'    | 'Houston'
2  |    'B'    | 'Houston'
3  |    'C'    | 'Houston'
4  |    'S'    | 'Boston'
5  |    'R'    | 'Detroit'
Run Code Online (Sandbox Code Playgroud)

结果看起来像:

   city   | group
--------------------
 'Houston'| 'Multiple'
 'Boston' |   'S'
 'Detroit'|   'R'
Run Code Online (Sandbox Code Playgroud)

我知道你可以这样做:

SELECT 
  City,
  CASE WHEN COUNT([group]) > 1 THEN 
      'Multiple'
  ELSE 
       ( SELECT [group] FROM test WHERE t.City = city )
  END AS CGroup

FROM 
   test t
GROUP BY 
   City
Run Code Online (Sandbox Code Playgroud)

我认为这应该更简单.
没有子查询的东西?

Dam*_*ver 8

你可以找到MINMAX列,然后采取行动,如果他们不相同:

declare @t table (ID int not null,[group] char(1) not null,city varchar(20) not null)
insert into @t(ID,[group],city) values
(1,'A','Houston'),
(2,'B','Houston'),
(3,'C','Houston'),
(4,'S','Boston' ),
(5,'R','Detroit')

select city,
   CASE
      WHEN MIN([group]) != MAX([group]) THEN 'Multiple'
      ELSE MAX([group]) END as [group]
from @t
group by city
Run Code Online (Sandbox Code Playgroud)

尽管服务器MAXselect子句中出现两次,但服务器应该足够智能,只能实际运行一次聚合.

结果:

city                 group
-------------------- --------
Boston               S
Detroit              R
Houston              Multiple
Run Code Online (Sandbox Code Playgroud)