3

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

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

办公室包含以下行:

ID |   group   |  city
----------------------
1  |    'A'    | 'Houston'
2  |    'B'    | 'Houston'
3  |    'C'    | 'Houston'
4  |    'S'    | 'Boston'
5  |    'R'    | 'Detroit'

结果看起来像:

   city   | group
--------------------
 'Houston'| 'Multiple'
 'Boston' |   'S'
 'Detroit'|   'R'

我知道你可以这样做:

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

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

4

3 回答 3

8

您可以找到列的MINand MAX,然后在它们不相同时采取行动:

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

服务器应该足够聪明,只实际运行MAX一次聚合,尽管它在select子句中出现了两次。

结果:

city                 group
-------------------- --------
Boston               S
Detroit              R
Houston              Multiple
于 2013-07-11T08:00:51.330 回答
2

@Damien_The_Unbeliever 的回答很完美。这是另一种选择。如果您想检查多个(例如COUNT(GROUP) > 2)。只需像这样使用MIN或:MAXELSE

SELECT 
  city,
  CASE WHEN COUNT([group]) > 2 
       THEN 'Multiple' 
       ELSE MAX([group]) END  AS Type 
FROM 
  offices
GROUP BY
  city

看到这个 SQLFiddle

于 2013-07-11T08:09:04.073 回答
0

使用您的第一个查询,但只MINELSE部分中使用 a

SELECT 
    City, 
    CASE
        WHEN COUNT(*) > 1 THEN 'Multiple'
        ELSE MIN(CityGroup)
    END AS CityGroup
FROM Test
GROUP BY CityGroup
于 2013-07-11T08:00:27.970 回答