2014-01-24 76 views
0

我从表格中拉出两列以返回具有当前日期日期但仅包含当前日期的特定行。例如,说铅笔的日期是1/22/2014和2/22/2014。我不希望显示它,因为它有两行具有唯一日期。但是,在使用count(*)> 1来获取这些唯一行后,我无法计算唯一行的数量。我试着对这个物品进行计数,然后检查这个物品(因此如果它只有一行,它会显示),哪个“有效”,但是然后检查了其他不起作用的值。在对唯一行进行计数后对唯一值进行计数?

use db 
    select todate, item 
    from table 
    group by todate, item 
    having count(*)>1 
    and cast(todate as date) = '2015-1-17' 
    and count(item)=1 
    order by item 

据我所知,这应该工作,不是吗?我的猜测是问题出在count(item)和它的'计数所有非唯一行而不是唯一行,但我不知道如何解决这个问题。无论如何只计算唯一的行吗?

对于这个表,

todate  item  
2015-01-17 pencil 
2015-01-17 pencil 
2014-02-22 pencil 
2015-01-17 pen 
2015-01-17  pen 
2015-01-17 eraser 

那么它应该返回

todate   item 
2015-01-17  pen 
2015-01-17  eraser 

,因为那些只能有唯一的日期。它不会返回铅笔,因为它有不止一个唯一的日期。

+0

请提供样本数据和期望的输出。 – RedFilter

回答

0

这两个查询都应该工作。你可以看到哪一个对你更好。 注意:如果todate列已经是日期数据类型,或者是时间总是午夜的日期时间,那么不要将其作为日期进行投射,并且由于不需要转换数据类型,因此性能会更好。

select item, min(cast(todate as date)) as todate 
from table 
group by item 
having min(cast(todate as date)) = '2015-1-17' --if you are wanting to filter for one date only 
and min(cast(todate as date)) = max(cast(todate as date)) --all records have the same date 
order by item 
; 

select item, min(cast(todate as date)) as todate 
from table 
group by item 
having min(cast(todate as date)) = '2015-1-17' --if you are wanting to filter for one date only 
and count(distinct cast(todate as date)) = 1 --this item has only one distinct date 
order by item 
; 
+0

非常感谢!所以我的问题是,我应该一直试图计算不同的东西,而不是项目? – PointXIV

+0

有几个问题。 1)你是通过todate进行分组的,2)你只检查至少有2条记录的计数(*)> 1的项目,所以如果你的数据示例不会显示橡皮擦,3)你正在计算行数对于计数(项目)> 1的项目具有非空值 – BateTech

相关问题