2017-04-05 1 views
0

저는 항상 가장 성능이 좋은 SQL 쿼리를 작성하려고 노력하고 있지만, 그러한 쿼리를 실행하는 데 필요한 최초의 사람이 아니어야한다고 생각하는 보고서 요청을 몇 번이고 반복합니다. 찾고있는 데이터 세트를 생성하는 더 좋은 방법이있을 것입니다.SQL 쿼리 요약 -

이 데이터의 테이블을 고려 SQL 서버 2012

에 관한,이 시나리오에서 판매를

enter image description here

라고 판매는 시작 날짜와 종료 날짜가 있습니다. 고객이 아직 서비스를 받고 있기 때문에 종료일이 null 일 수 있습니다 (예 : 구독 기반 제품/서비스). 위의 데이터에서 3 명의 고객이 서비스를 중지했으며 5 명은 여전히 ​​서비스를 받고 있음을 알 수 있습니다.

최고의 쿼리 (들)이 이런 식으로 아래의 설정을 작성하는 것이 무엇 :

enter image description here

* 분명히 데이터 세트는 다르지만, 예를 들어이 두 번째 이미지입니다.

결과의 "활성"상태는 고객의 StartDate가 월 열 앞에 있고 고객의 종료일이 null이거나 월 열 뒤에있는 경우입니다.

-이 작업은 엄청난 양의 인라인 셀렉션으로 수행 할 수 있습니다. - 아마도 T-SQL의 PIVOT으로이 작업을 수행 할 수 있지만 위의 StartDate/EndDate 로직을 포함 할 수 있는지, 가능한 경우 (가능한 경우) 및 가능한 경우 수행 가능한지 여부는 확실하지 않습니다.

생각? 아이디어? 예? 감사합니다.

+1

먼저 표시하고자하는 달이 필요합니다. 이것을 위해 values ​​절을 사용할 수 있습니다. 그런 다음 한 달에 적용되는 레코드를 얻을 수 있도록 테이블에 가입하십시오. 그런 다음 부서 및 월별 집계/피벗. (종종 피벗 작업은 SQL : SQL이 아닌 응용 프로그램에서 수행되므로 데이터를 가져오고 응용 프로그램은 프레젠테이션을 신경 써야합니다.) –

답변

1

동적 피벗을 찾고 있다면, 다음과 같은

일부 샘플 데이터

--Drop Table #YourTable 
Create Table #YourTable (CustomerID int,StartDate date,EndDate date,SalesPersonID int,ServicePalnID int,DivisionID int) 
Insert Into #YourTable values 
(1,'2017-01-01','2017-02-06',1,5,1), 
(2,'2017-01-01',null  ,1,5,1), 
(3,'2017-02-04',null  ,1,5,1), 
(4,'2017-02-05','2017-04-05',1,5,2), 
(5,'2017-06-06',null  ,2,6,2), 
(6,'2017-03-26','2017-04-03',2,6,2), 
(7,'2017-04-01',null  ,2,6,3), 
(8,'2017-04-04',null  ,3,6,3) 

만들기 동적 쿼리

Declare @Date1 date = '2017-01-01' 
Declare @Date2 date = GetDate() 

Declare @SQL varchar(max) = Stuff((Select ',' + QuoteName(format(D,'MMM yyyy')) 
            From (
              Select Top (DateDiff(MONTH,@Date1,@Date2)+1) 
                D=DateAdd(MONTH,-1+Row_Number() Over (Order By Number),@Date1) 
              From master..spt_values 
             ) A 
            For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [YAxis] as [Division],' + @SQL + ' 
From (
     Select YAxis = concat(''Division '',A.DivisionID) 
       ,XAxis = format(D,''MMM yyyy'') 
       ,Value = 1 
     From #YourTable A 
     Join (
       Select Top (DateDiff(MONTH,'''+concat('',@Date1)+''','''+concat('',@Date2)+''')+1) 
         D=DateAdd(MONTH,-1+Row_Number() Over (Order By Number),'''+concat('',@Date1)+''') 
       From master..spt_values 
      ) B 
      on D between DateFromParts(Year(StartDate),month(StartDate),1) and EOMonth(IsNull(EndDate,GetDate())) 
    ) A 
Pivot (sum(Value) For [XAxis] in (' + @SQL + ')) p' 
Exec(@SQL); 

반환

을 고려

enter image description here