2010-01-29 3 views
0

나는 매월 12 열에 프로덕션 환경에서 테이블이 있습니다. productID, Customer 및 Month 매개 변수에 전달하는 SP를 만들어 해당 월의 합계를 검색해야합니다.12 개월 12 열 SQL 테이블에 대한 쿼리를 단순화

현재 나의 논리는

if month = 1 then 
    select sum(JAN) from table where productID = @id and customer = @cust 
if month = 2 then 
    select SUM(FEB) from table where productID = @id and customer = @cust 

.... 

쿼리는 조금 더 복잡하지만, 이것은 그것의 핵심입니다. 이 "IF"진술 주위에 어떤 방법이 있습니까?

편집 -이는 SQL Server 2000 데이터베이스하지만 SQL Server 2005로 마이그레이션됩니다, UNPIVOT 편리 올 것이다 PIVOT과 나는 2005 년

+0

답변이 모두 우수했습니다. 감사합니다 –

답변

2
select sum(case when @month = 1 then Jan 
     when @month = 2 then Feb 
     when @month = 3 then Mar 
     when @month = 4 then Apr 
     when @month = 5 then May 
     when @month = 6 then Jun 
     when @month = 7 then Jul 
     when @month = 8 then Aug 
     when @month = 9 then Sep 
     when @month = 10 then Oct 
     when @month = 11 then Nov 
     when @month = 12 then [Dec] end) 
     from mytable 
     where productID = @id and customer = @cust 

을 당신이 변수를 선언하고 inialize 가정이 작동합니다. 물론 여러 달을 지내기를 원한다면 디자인 과정이 질의에 가장 적합하지 않은 이유 중 하나가 더 복잡합니다.

6

UNPIVOT에서보세요 SQL 서버로 이동할 때 - 당신이 것 행으로 열을 만든 다음 관심있는 달 만 행을 얻기 위해 WHERE 절을 사용하는 UNPIVOT

내부 :.

SELECT * 
FROM tbl UNPIVOT FOR Month IN ([JAN], [FEB], etc...) 

그런 다음 번호로 달을 번역하는 테이블에 조인 JAN 1 FEB 2 기타.

그리고 마음에 오는 WHERE MonthNum = @param

+2

나는 또한 쿼리를 제대로 만들 수 있도록 UNPIVOT으로 VIEW를 만드는 것이 좋습니다. –

+1

테이블 구조를 변경할 수 없다고 가정 할 때이 상황에 대한 좋은 실제 솔루션처럼 보입니다. 그러나 쿼리에 구문 오류가있을 수 있습니다. –

+0

@MarkByers 죄송합니다. 저는 테이블과 전체 샘플을 조롱하기에는 너무 게을 렀습니다. 따라서 의사 코드 –

1

우선 - 쿼리를 생성하고 간단한 EXEC으로 실행하는 동적 SQL을 사용할 수 있습니다.

이것은 나에게 소리가 들리지 않는 솔루션처럼 들리지만 간단한 쿼리의 경우 가장 쉬운 옵션으로 가지 않을 이유가 없습니다.

+0

SARGABLE이겠습니까? –

8

데이터베이스를 올바르게 표준화하지 못했기 때문에 쿼리를 작성하는 것이 어렵다고 생각합니다.

productId 
customer 
JAN 
FEB 
... 

어느 쪽이든 또는 그렇게 보이는 임시 테이블을 만든 저장 프로 시저에 더욱 :

당신은 열이있는 테이블이 나타납니다. 이것은 SQL에서이를 수행하는 최선의 방법은 아닙니다. 당신은 당신의 테이블 구조로 이런 일을하는 것을 목표로한다 :

productId 
customer 
date 
amount 

그런 다음 간단한을 사용하여 쿼리를 작성할 수 있습니다 WHERE 절 :

SELECT SUM(amount) 
FROM table 
WHERE MONTH(date) = month AND productID = @id and customer = @cust 

또한 쿼리에 연도를 확인 할 수 있습니다 그렇지 않으면 2009 년 1 월과 2010 년 1 월 데이터를 합산 할 수 있습니다. 아니면 ... 매년 테이블을 보유하고있을 수도 있습니다. (난 안 바랍니다!)


참고 :이 시점에서 테이블 구조를 변경하는 물론, 실제로 가능하지 않을 수 있습니다. 나는 아직도 당신이이 문제를 알지 못했을 때를 대비해서 언급 할 가치가 있다고 느꼈다. 적어도 이것에 대해 아는 것이 미래에 같은 실수가 다시 발생하는 것을 막을 수 있습니다.

+0

동의하지만 옵션이 제한됩니다. 이것은 업그레이드 될 기존 시스템입니다. –

+0

그러면 Cade Roux의 솔루션이 필요합니다. –

+0

SQL Server 2000이므로 UNPIVOT에는 아무런 문제가 없습니다. 데이터베이스 서버 버전을 나타내는 게시물을 편집했습니다. –

1

당신은 SQL Server의 UNPIVOT 기능을 볼 수 있었다 - UnPivot

0
select sum(quantity) from table unpivot (quantity for month in (jan,feb,mar/*etc*/)) as t where where productID = @id and customer = @cust and month='jan' 
3

방법에 대해 :

declare @month int 
set @month = 2 
select sum(case @month 
       when 1 then JAN 
       when 2 then FEB 
       when 3 then MAR 
       when 4 then APR 
       when 5 then MAY 
       when 6 then JUN 
       when 7 then JUL 
       when 8 then AUG 
       when 9 then SEP 
       when 10 then OCT 
       when 11 then NOV 
       when 12 then DEC 
       else 0 
      end) 
from table 
where productID = @id 
and customer = @cust 
+0

방금 ​​나를 이겼다. – HLGEM

관련 문제