2014-09-29 2 views
1

롤링 36 개월 단위 판매 내역을 가져 오는 쿼리가 있습니다. 그것은 그대로 작동하지만, 시간이 오래 걸리고 번거로운 방법이 있는지 궁금해했습니다.SQL SELECT 문 단순화?

쿼리의 두 부분 즉, 머리글과 데이터가 있습니다. 여기

내가 헤더를 위해 무엇을 가지고 : - 일 2011 그것은으로 진행 ...

, DATEADD(m, -03, GETDATE()-day(GETDATE()-1)) AS "MM03" 
, DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AS "MM02" 
, DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AS "MM01" 

6월부터 8월까지 오늘로

SELECT 
DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AS "MM36" 
, DATEADD(m, -35, GETDATE()-day(GETDATE()-1)) AS "MM35" 
, DATEADD(m, -34, GETDATE()-day(GETDATE()-1)) AS "MM34" 

이 구월이다 36 줄의 코드. 다음과 같이 단위 판매 데이터를 뽑아

명령문은 다음과 같습니다 - 일 2011 그것은으로 진행 ...

, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -03, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -02, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty03" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -02, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -01, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty02" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -01, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -00, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty01" 

오늘로

, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -36, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -35, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty36" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -35, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -34, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty35" 
, SUM (CASE WHEN "SalesTable"."SalesDate" BETWEEN DATEADD(m, -34, GETDATE()-day(GETDATE()-1)) AND DATEADD(m, -33, GETDATE()-day(GETDATE()-1))-1 THEN "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" ELSE NULL END) AS "NetQty34" 

이 구월이다 6 월 - 2014 년 8 월.

이 보고서를 작성하기 전에 추가 할 항목이 많으므로 가능한 한 깔끔하게 정리하고 싶습니다.

감사합니다,

편집

아래의 예는 내가해야했다, 그래서 위의 코드와 나는 이미지를 게시 할 수있는 담당자가없는 (원하는 것을 얻을 수 있어요 것을 보여줍니다 링크). 또한 피벗 테이블에서 아이템 번호와 롤링 월이 누락되었음을 보여줍니다. 이 두 가지를 어떻게 추가합니까?

Example

는 내가 "ItemTable"을 삭제했습니다. 다음과 같이 "itemNum이는"필드,하지만 내 크리스탈 보고서에 표시되지 않습니다. 아무데도 내가 그것을 넣어려고, 나는 "바인딩 될 수 없다"오류가 발생합니다.

select 
[0] MM00 
, [1] MM01 
, [2] MM02 
, ... 
from (
select 
    "ItemTable"."ItemNum",DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago 
, "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
from your_table 
) as source 
pivot 
(
sum(NetQty) For months_ago in ([0], [1], [2], [3], ...) 
) as PivotTable 

다시 한번 감사드립니다.

+0

1 개월 쿼리를 만들고 1에서 36까지 증가하는 WHILE 루프로 래핑하십시오. –

답변

2

이 상황은 Pivot table에 대해 익숙해 보입니다. 항목 번호 포함 똑바로 앞으로 상당히입니다 : 예를 정련하는 편집

select 
    [0] MM00 
    , [1] MM01 
    , [2] MM02 
    , ... 
from (
    select 
     DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
    from your_table 
) as source 
pivot 
(
    sum(NetQty) For months_ago in ([0], [1], [2], [3], ...) 
) as PivotTable 

의 라인을 따라

뭔가 그것을 select 문에 포함 시키십시오. 당신의 피 ~ 컬럼에 대한 동적 이름을 갖는

select 
    "ItemTable"."ItemNum" 
    , [0] MM00 
    , [1] MM01 
    , [2] MM02 
    , ... 
from (
    select 
     "ItemTable"."ItemNum" 
    , DateDiff(m, "SalesTable"."SalesDate", GetDate()) months_ago 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
    from your_table 
) as source 
pivot 
(
    sum(NetQty) For months_ago in ([0], [1], [2], [3], ...) 
) as PivotTable 

오히려 더 어렵습니다. 일반적인 생각은 SQL을 문자열로 빌드하고 동적으로 실행해야한다는 것입니다. Google 검색은 많은 결과를 산출합니다 (예 : a SQL Hints blog).일반적인 아이디어를 줄 수있는 불완전한 코드가 있습니다.

SET @DynamicPivotQuery = 
N'select 
    "ItemTable"."ItemNum" 
    , [' + @Name1 + '] 
    , [' + @Name2 + '] 
    , [' + @NameN + '] 
from (
    select 
     "ItemTable"."ItemNum" 
     /* search MSDN for the best date formatting algorithm */ 
    , CONVERT_TO_STRING("SalesTable"."SalesDate") month 
    , "SalesTable"."SalesQty" - "SalesTable"."ReturnsQty" NetQty 
    from your_table 
) as source 
pivot 
(
    sum(NetQty) For month in (
     [' + @Name1 + '] 
    , [' + @Name2 + '] 
    , [' + @NameN + '] 
) 
) as PivotTable'; 

--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 
+0

피드백을 높이 평가하십시오. 이 같은 것이 훨씬 더 효율적입니다. 내가 지금까지 얻은 것에 대해 설명 할 수있는 위의 편집을 참조하십시오. – SOSteppenwolf

+0

굉장합니다. 표시 할 항목이 없습니다. 내가 다르게해야만 한 일은 첫 번째 SELECT 연산자 아래에 테이블 이름 ("ItemTable".)을 놓는 것입니다. 거기에 대한 이유가 확실하지 않지만 작동합니다. 역동적 인 이름으로 장난감을 사야 만 작동하는지 확인할 수 있습니다. 당신은 제가 진보를하도록 도왔습니다, 그래, 고마워. – SOSteppenwolf