2014-01-24 3 views
0

Я вынимаю два столбца из таблицы, чтобы возвращать определенные строки, которые имеют даты для текущей даты, но только текущую дату. Например, скажем, у карандашей есть даты 1/22/2014 и 2/22/2014. Я не хочу, чтобы это отображалось, потому что оно имеет две строки с уникальными датами. Тем не менее, у меня возникли проблемы с подсчетом количества уникальных строк после использования счетчика (*)> 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 

Насколько я могу судить, это должно сработать, не так ли? Я предполагаю, что проблема заключается в счете (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 уже является типом данных даты или является временем datetime, где время всегда полночь, то не записывать в качестве даты, и оно будет работать лучше, поскольку ему не нужно преобразовывать типы данных.

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

Большое спасибо! Итак, моя проблема в том, что я должен был попытаться подсчитать отличный todate, а не элемент? – PointXIV

+0

Было несколько проблем. 1) вы группировались по дате, 2) вы проверяли только те предметы, у которых было как минимум 2 записи со счетом (*)> 1, так что ластик, если ваш пример данных не будет отображаться, 3) вы подсчитывали количество строк который имел ненулевое значение для элемента со счетом (item)> 1 – BateTech

Смежные вопросы