只返回记录count()= 1

时间:2015-01-22 10:08:57

标签: sql sql-server

我有一个名为myTable的表

Posting Date|Item No_|Entry Type|
2015-01-13|1234|1
2015-01-13|1234|1
2015-01-12|1234|1
2015-01-12|5678|1
2015-02-12|4567|1

我想要的只是返回结果,其中[项目编号_]是表1的时间。 所以在我的表的这个例子中,我只想返回[Item No_] 5678和4567,因为其中只有一条记录。然后忽略[Item No_] 1234

这是我试过的SQL,但有些不对劲。任何人都可以帮助我吗?

SELECT [Item No_], [Posting Date], COUNT([Item No_]) AS Antal
FROM         myTable
GROUP BY [Entry Type], [Posting Date], [Item No_]
HAVING      ([Entry Type] = 1) AND (COUNT([Item No_]) = 1)
ORDER BY [Posting Date] DESC

3 个答案:

答案 0 :(得分:3)

select [Item No_]
from myTable
group by [Item No_]
having count(*)=1

答案 1 :(得分:2)

Posting Date

中删除group by
SELECT [Item No_],Entry Type, COUNT([Item No_]) AS Antal
FROM    myTable
GROUP BY [Entry Type], [Item No_]
HAVING   COUNT([Item No_]) = 1

或者如果您想要其他详细信息,请使用subquery

SELECT [Item No_],
       Entry   Type,
       Posting Date
FROM   myTable a
WHERE  EXISTS (SELECT 1
               FROM   myTable b
               where a.[Item No_]=b.[Item No_]
               GROUP  BY [Entry Type],
                         [Item No_]
               HAVING Count(1) = 1) 
ORDER BY [Posting Date] DESC

window function

;WITH cte
     AS (SELECT [Item No_],
                [Posting Date],
                [Entry Type],
                Row_number()OVER (Partition BY [Entry Type], [Item No_] ORDER BY [Item No_]) RN
         FROM   myTable)
SELECT *
FROM   cte a
WHERE  NOT EXISTS (SELECT 1
                   FROM   cte b
                   WHERE  a.[Item No_] = b.[Item No_]
                          AND rn > 1) 
ORDER BY [Posting Date] DESC

答案 2 :(得分:0)

您可以在Sql Server中使用ROW_Number()

select * from (
SELECT [Item No_], [Posting Date], 
Row_Number() over (Parition by [Item No_]
order by [Item No]) RN
FROM         myTable
)D
where D.RN=1