2016-06-05 4 views
0

나는 음악 상점의 베스트 셀러 장르의 몇 개가 '2008 년에 일부 뮤직 스토어에서 판매 된 것을 알 필요가있는 SQL 문제를 수행하고 있습니다. 많은 테이블이 있지만, 지금까지 필자가 필요로하는 대부분의 정보를 함께 묶을 수있었습니다. 여기에서SQL 날짜로 필터링하는 방법

select 
    music_store.invoice_lines.invoice_id, 
    music_store.invoice_lines.track_id, 
    music_store.invoice_lines.quantity, 
    music_store.invoices.invoice_date, 
    music_store.invoices.id, 
    music_store.tracks.genre_id 
from 
    music_store.invoice_lines 
inner join 
    music_store.invoices on music_store.invoice_lines.invoice_id = music_store.invoices.id 
inner join 
    music_store.tracks on music_store.tracks.id = music_store.invoice_lines.track_id; 

, 나는 (다른 테이블 인) 해당 장르를 발견, 2008 년에 끝나지 않는 송장의 날짜를 모두 필터링 한 다음 music_store.tracks.genre_id 모드를 찾을 필요 모든 "수량"값을 합산하십시오.

어떻게하면됩니까? 나는 꽤 잃어버린 사람이며, SQL에 대한 절대적인 초보자이며 일반적으로 프로그래밍 초급자입니다.

EDIT : 내가 사용하고있는 DBMS, 아마도 가장 표준적인 SQL 버전을 모르겠습니다. 왜건에서 SQL을 실행하고 있습니다

+1

'extract (year from invoice_date) = 2008' 또는 사용중인 DBMS와 비슷한 항목 –

+1

사용중인 dbms에 태그를 지정하십시오! (많은 경우 날짜/시간과 관련하여 ANSI SQL을 준수하지 않기 때문에 대답은 제품에 따라 다를 수 있습니다.) – jarlh

+0

날짜 값에서 연도를 추출 할 수없는 경우'invoice_date BETWEEN '2008-01-01'AND '2008-12-31'또는 해당 주제에 대한 DBMS 관련 변형. –

답변

1

사용중인 특정 RDBMS를 알지 못하면 SQL 코드는 genre_id의 모드를 얻는 것과 같습니다. 그런 다음 장르 테이블에 가입하여 장르 이름을 얻을 수 있습니다. 희망이 도움이됩니다.

select music_store.tracks.genre_id, COUNT(1) genre_count 
from music_store.invoice_lines 

INNER JOIN music_store.invoices 
on music_store.invoice_lines.invoice_id = music_store.invoices.id 
INNER JOIN music_store.tracks 
on music_store.tracks.id = music_store.invoice_lines.track_id 

WHERE YEAR(music_store.invoices.invoice_date) = 2008 
GROUP BY music_store.tracks.genre_id 
ORDER BY genre_count DESC 
LIMIT 1; 
1

가장 일반적인, 가능성 최고 성능 ("스 SARGable") 접근 방식은 단순히 2 날짜를 지정하고 그 날짜가 설정 한 범위 내에서 레코드를 선택하는 것입니다. < 함께 사용

WHERE invoices.invoice_date >= '2008-01-01' 
    AND invoices.invoice_date < '2009-01-01' 

은> = 의도적이며 열이 어떤 시간 단위 정밀도로 평가되고 있습니다. 또한 dbms는 데이터의 함수를 피함으로써 날짜 컬럼에서 인덱스를 사용할 수 있으며 각 함수의 계산도 피할 수 있습니다.

사용중인 dbms를 지정하지 않았으므로이 날짜 리터럴을 어떻게 지정해야하는지 예측할 수 없습니다. 당신은

WHERE invoices.invoice_date >= '20080101' 
    AND invoices.invoice_date < '20090101' 

또한 실제 있습니다

WHERE invoices.invoice_date >= str_to_date('2008-01-01','%Y-%m-%d') 
    AND invoices.invoice_date < str_to_date('2009-01-01','%Y-%m-%d') 

오라클에게 예

MySQL은 같은 TO_DATE() 또는 STR_TO_DATE()를 사용하는

WHERE invoices.invoice_date >= to_date('2008-01-01','yyyy-mm-dd') 
    AND invoices.invoice_date < to_date('2009-01-01','yyyy-mm-dd') 

T-SQL

필요 안된다 invoices.invoice_date 열의 데이터 유형은 적용 할 수있는 함수에 영향을 미치며, 열은 날짜/시간 값처럼 보이는 문자열이 아닙니다.

관련 문제