2013-11-27 58 views
-1

我已經編寫了一個動態SQL數據透視查詢,返回一個數量每天,返回的列數是動態的基於開放參數之間的天數。我遇到的問題是列不在DateOrder中,我猜我需要一些表單或Order By來解決這個問題,有沒有人有任何想法,我需要把它放在?SQL Dynamic Pivot

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

    --declare and set variables 
    DECLARE @v_Columns VARCHAR(MAX) 
    ,@v_StartDate DATETIME = GETDATE() - 10 
    ,@v_EndDate DATETIME = GETDATE() 
    ,@v_Query VARCHAR(max) 

--select results 
SELECT @v_Columns = Coalesce(@v_Columns, '[') + convert(VARCHAR, cast(DateCreated AS DATE), 111) + '],[' 
FROM (
    SELECT DISTINCT cast(DateCreated AS DATE) AS DateCreated 
    FROM TransactionOriginTracking 
    ) tot 
WHERE tot.DateCreated BETWEEN @v_StartDate 
     AND @v_EndDate 

SET @v_Columns = SUBSTRING(@v_Columns, 1, Len(@v_Columns) - 2) 
SET @v_Query = 'select 
    * 
from 
(
SELECT 
    cast(Tracking.DateCreated as date) as [Date], 
    th.TotalQuantity [Quantity] 
FROM 
    TransactionHeader th 
    Inner JOin TransactionOriginTracking as Tracking on Tracking.TransactionHeaderId = th.Id 
     and Tracking.WorkflowStageId = 9 
    Inner Join CompanyDivision on CompanyDivision.Id = th.CompanyDivisionId 
WHERE 
    Tracking.DateCreated between ''' + CONVERT(VARCHAR(50), @v_StartDate, 111) + ''' AND ''' + CONVERT(VARCHAR(50), @v_EndDate, 111) + ''' 
) as src 
Pivot 
(
SUM(src.Quantity) 
For src.Date IN (' + @v_Columns + ') 
) as PivotView' 

EXEC (@v_Query) 

回答

1

當你建立你的列清單,按日期排序:

--select results 
SELECT 
    @v_Columns = Coalesce(@v_Columns, '[') + convert(VARCHAR, cast(DateCreated AS DATE), 111) + '],[' 
FROM 
    (SELECT DISTINCT 
     CAST(DateCreated AS DATE) AS DateCreated 
    FROM 
     TransactionOriginTracking) tot 
WHERE 
    tot.DateCreated BETWEEN @v_StartDate AND @v_EndDate 
ORDER BY 
    tot.DateCreated