1

我在尝试GROUP BY VARCHAR字段时目睹了一种奇怪的行为。

以下面的示例为例,我尝试找出过去至少更改过一次姓名的客户。

CREATE TABLE #CustomersHistory
(
Id INT IDENTITY(1,1),
CustomerId INT,
Name VARCHAR(200)
)

INSERT INTO #CustomersHistory VALUES (12, 'AAA')
INSERT INTO #CustomersHistory VALUES (12, 'AAA')
INSERT INTO #CustomersHistory VALUES (12, 'BBB')
INSERT INTO #CustomersHistory VALUES (44, '444')

SELECT ch.CustomerId, count(ch.Name) AS cnt
  FROM #CustomersHistory ch
  GROUP BY ch.CustomerId  HAVING  count(ch.Name) != 1

奇怪的是(好像第一个 INSERT 中的“AAA”与第二个不同)

CustomerId  cnt  //  (I was expecting)
12          3    //   2
44          1    //   1
  • 这种行为是否特定于 T-SQL?
  • 为什么它会以这种相当违反直觉的方式表现?
  • 通常如何克服这个限制?

注意:这个问题与 VARCHAR 的 GROUP BY 问题非常相似,我没有找到为什么的答案

旁注:HAVING count(ch.Name) != 1使用而不是好习惯HAVING count(ch.Name) > 1吗?

4

1 回答 1

2

运算符将COUNT()计算所有行,而不考虑值。我认为您可能想使用 aCOUNT(DISTINCT ch.Name)只计算唯一名称。

SELECT ch.CustomerId, count(DISTINCT ch.Name) AS cnt
  FROM #CustomersHistory ch
  GROUP BY ch.CustomerId  HAVING  count(DISTINCT ch.Name) > 1

有关更多信息,请查看在线图书上的COUNT()文章

于 2013-02-04T17:29:01.473 回答