SQL有计数逻辑

时间:2016-02-16 03:24:35

标签: sql sql-server-2012 group-by having

我需要HAVING COUNT的帮助,我有以下数据结果:

CREATE TABLE #tmpTest1 (Code VARCHAR(50), Name VARCHAR(100))

INSERT INTO [#tmpTest1]
(
    [Code],
    [Name]
)
SELECT '160215-039','ROBIN'
UNION ALL SELECT '160215-039','ROBIN'
UNION ALL SELECT '160215-046','SENGAROB'
UNION ALL SELECT '160215-046','BABYPANGET'
UNION ALL SELECT '160215-045','JONG'
UNION ALL SELECT '160215-045','JAPZ'
UNION ALL SELECT '160215-044','AGNES'
UNION ALL SELECT '160215-044','AGNES'
UNION ALL SELECT '160215-041','BABYTOT'
UNION ALL SELECT '160215-041','BABYTOT'
UNION ALL SELECT '160215-041','BABYTOT'

我想只显示具有相同code但不同name的行,所以在这种情况下我的预期结果如下,因为它们具有相同的代码但名称不同:

160215-045  JAPZ
160215-045  JONG
160215-046  BABYPANGET
160215-046  SENGAROB

但是当我尝试group两列时,请使用having count,以下是我的查询:

SELECT [Code], [Name] FROM [#tmpTest1] 
GROUP BY [Code], [Name] HAVING COUNT([Code]) > 1

它给出了我错误的结果,其中的行具有相同的代码和名称,它与我想要的相反。

160215-044  AGNES
160215-041  BABYTOT
160215-039  ROBIN

我如何获得预期的输出?

在此先感谢,任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:2)

我相信这个查询会给你你想要的结果,虽然你原来的问题有点不清楚。

SELECT t1.[Code], t1.[Name]
FROM [#tmpTest1] t1
INNER JOIN
(
    SELECT [Code]
    FROM [#tmpTest1] 
    GROUP BY [Code]
    HAVING COUNT(DISTINCT [Name]) > 1
) t2
    ON t1.[Code] = t2.[Code]

请按照以下链接查看正在运行的演示:

SQLFiddle

答案 1 :(得分:2)

如果您想要具有相同代码和名称的行,请使用窗口函数:

select t.*
from (select t.*, count(*) over (partition by code, name) as cnt
      from #temptest1 t
     ) t
where cnt >= 2;

答案 2 :(得分:1)

来自您的评论

  

如果代码有1个不同的名称,我想显示那些   记录让我知道有一个与其他人不同。

这听起来像exists查询,因为您要检查是否存在具有相同代码但名称不同的另一行。

select * from [#tmpTest1] t1
where exists (
  select 1 from [#tmpTest] t2
  where t2.code = t1.code
  and t2.name <> t1.name
)