2014-01-24 2 views
0

현재 날짜의 날짜가 있지만 현재 날짜 만있는 특정 행을 반환하기 위해 테이블에서 두 개의 열을 가져옵니다. 예를 들어 연필에 2014 년 1 월 22 일 및 2014 년 2 월 22 일 날짜가 있다고 가정 해 보겠습니다. 고유 한 날짜가있는 두 행이 있기 때문에 표시하지 않으려합니다. 그러나 고유 한 행을 얻기 위해 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 

제가 말할 수있는 한, 작동해야합니까, 그렇지 않아야합니까? 내 생각 엔 문제는 개수 (항목)에 있으며 고유 한 행 대신 모든 고유하지 않은 행이 계산되지만 문제를 해결하는 방법을 모르겠습니다. 어쨌든 고유 한 행만 계산합니까? 그 단 하나의 고유 한 일이 있기 때문에이 테이블을 감안할 때

,
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

정말 고마워요! 그래서 제 문제는 아이템 대신에 뚜렷한 구식 점을 계산해야한다는 것입니다. – PointXIV

+0

몇 가지 문제가있었습니다. 1) 당신은 todate로 그룹화했습니다. 2) count (*)> 1 인 레코드가 2 개 이상있는 항목 만 검사 했으므로 데이터 예제가 표시되지 않으면 지우개가 나타납니다. 3) 행 수를 세고있었습니다. count (item)> 1 인 항목에 대해 null이 아닌 값이있는 – BateTech

관련 문제