2016-06-10 3 views
0

약간의 시간이 계속되지만 여기 간다 :SQL 열은

아픈 당신이 내 데이터 집합 보여 예제 데이터를 통해 : 판매, 제품 및 고객에 대한 질의가 있습니다. 그것은 다음과 같이 보인다 :

customer_type | region | product_name | date  | sale_value 
smallstore | north | chair  | 2016-01-01 | 22482 
mediumstore | south | table  | 2016-02-02 | 50582 
bigstore  | east | desktop  | 2016-02-02 | 83737 
smallstore | north | chair  | 2015-01-01 | 23828 
mediumstore | south | coach  | 2015-02-02 | 93833 
bigstore  | east | desktop  | 2015-02-02 | 83282 

쿼리는 다음과 같이 보일 것이다 :

나는 다음 결과 얻을 필요가
select 
c.customer_type, 
c.region, 
p.product_name, 
s.date, 
sum(s.sale_value) 
from 
sales s 
inner join products p on p.id = s.product_id 
inner join customers c on c.id = s.customer_id 
group by c.customer_type, c.region, p.product_name, s.date, 

: 즉 그래서

customer_type | region | product_name | date  | sales2015 | sales2016 
smallstore | north | chair  | 2015-01-01 | 23828  | 22482 
mediumstore | south | table  | 2016-02-02 | 0   | 50582 
mediumstore | south | coach  | 2015-02-02 | 93833  | 0 
bigstore  | east | desktop  | 2015-02-02 | 83282  | 83737 

을 : 내가 얻을 필요 각 CUSTOMER_TYPE, 지역 및 제품 _는, 2015 년 매출은 내가 얻을 수있는 쿼리를 변경할 수있는 방법 2016 년

에 비해 그거? 나는 형태

select 
c.customer_type, 
c.region, 
p.product_name, 
s.date, 
(select sum(sale_value) from ... where date between 2015-01-01 and 2015-12-31 group by ...) as sales2015, 
(select sum(sale_value) from ... where date between 2016-01-01 and 2016-12-31 group by ...) as sales2016, 
from 
sales s 
inner join products p on p.id = s.product_id 
inner join customers c on c.id = s.customer_id 
group by c.customer_type, c.region, p.product_name, s.date, 

의 서브 쿼리의 다른 변화를 시도했지만 메인 쿼리와 하위 쿼리에 가입 할 ID가 없기 때문에 나는 선택 사이의 크로스 제품을 얻고있다. 나는 또한 1 년 또는 다른 한 해 동안 누락 된 가치를 관리하는 방법을 모른다.

당신의 도움이 당신에게 사전에 대단히 감사합니다. 대신 하위 쿼리의

+0

나는 테이블의 열'sales' 표시되지 않습니다. – Tenzin

+0

'sale_value'입니다. 죄송합니다 –

답변

0

, 당신은 사용할 수 있습니다

... 
sum(iif(year(date)=2015,sale_value,0)) as sales2015, 
sum(iif(year(date)=2016,sale_value,0)) as sales2016, 
... 

또한, 당신은 선택과에 의해 그룹에서 s.date을 제거해야합니다.

+0

아래 SQL 서버 2008 또는를 사용하여, 당신은 [CASE 표현식]을해야하는 경우 (https://msdn.microsoft.com/en-us/library/ms181765.aspx) 대신. '... SUM (CASE WHEN YEAR (날짜) = THEN Sales_Value ELSE 0 END) As Sales2016 ...'. 도움이 더 필요한 경우 사용되는 기술은 [크로스 탭]이라고합니다 (https://technet.microsoft.com/en-us/library/aa172756 (V = sql.80)에서 .aspx). –

+0

도와 주셔서 대단히 감사합니다. 대상 데이터가 말했듯이, 내 SQL 버전은 iff를 지원하지 않았습니다. 왜 iff에 오류가 있지만 조건에 표시되지 않았기 때문에 확실하지 않습니다. 그러나 CASE를 사용했는데 문제없이 작동했습니다. –

+0

목적지 데이터 @ 크로스 탭 참조뿐만 아니라 주셔서 감사합니다, 난 그냥 검색하는 방법을 알고하지 않았다. –