2017-04-05 60 views
0

我總是試圖編寫性能最高的SQL查詢,但我一次又一次遇到報告請求,我覺得我不應該成爲運行此類查詢所需的第一個人並且可能有更好的方法來生成我正在查找的數據集。SQL查詢摘要 -

這適用於SQL Server 2012的

考慮數據的這個表,稱爲銷售

​​

在這種情況下,一個單位有一個開始日期和結束日期。結束日期可能爲空,因爲客戶仍在接受服務(例如,考慮基於訂閱的產品/服務)。您會注意到,在上述數據中,3位客戶已停止服務,5位仍在接受服務。

什麼是最佳的查詢(一個或多個)寫打開下面弄成這個樣子:

enter image description here

*明顯的數據集是不同的,但作爲一個例子第二個圖像。

如果客戶的StartDate在月份列之前或客戶的EndDate爲空或在月份列之後,結果中的「活動」狀態將爲。

- 這可以用大量的內嵌選擇(這將是可怕的)完成。 - 也許這可以用T-SQL的PIVOT來完成,但我不清楚上面可能包括StartDate/EndDate邏輯,如何(如果可能)以及它是否會被執行(如果可能)

思考?想法?例子? 謝謝!

+1

首先,你需要你想顯示的月份。你可以爲此使用一個值子句。然後加入表格,以便獲得適用於一個月的記錄。然後彙總/每個部門和每月的數據。 (通常,數據透視是在應用程序中完成的,而不是在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