2017-08-30 119 views
1

我有給低於我SalesExVAT,通過BranchNoFiscalWeek樞軸數據在SQL

有每枝僅1記錄每個星期:

Select 
     sa.BranchNo 
     ,sa.FiscalWeek 
     ,sa.SalesExVAT 
    From 
     dbo.SalesAggregateWeek sa 
    Where 
     sa.FiscalYear = 2016 

我想在一個顯示此樞格式

我曾嘗試以下,

Select 
    MyData.BranchNo 

From 
    (Select 
     sa.BranchNo 
     ,sa.FiscalWeek 
     ,sa.SalesExVAT 
    From 
     dbo.SalesAggregateWeek sa 
    Where 
     sa.FiscalYear = 2016) MyData 
Pivot 
(sum(MyData.salesexvat) 
    For 
    MyData.FiscalWeek In (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 
        ,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52) ) 

所需的出落得將有FiscalWeek沿頂部的標題,則顯示BranchNo順着左邊,SalesExVAT信息作爲數據。因爲我沒有用PIVOT尚未

什麼我必須做糾正我的代碼的任何想法,歡迎。

+0

是什麼問題? –

+0

它只是不適合我我一定是錯過了什麼或做錯了 – PeterH

+1

這是什麼問題?基於你的支點,你的頭是財政周,這應該工作。 – Isaiah3015

回答

2

最終的查詢是這樣的:

Select * 

From 
    (Select 
      sa.BranchNo 
      ,sa.FiscalWeek 
      ,sa.SalesExVAT 
     From 
      dbo.SalesAggregateWeek sa 
     Where 
      sa.FiscalYear = 2016) P 
Pivot 
     (Sum (SalesExVAT) 
     For FiscalWeek In  
     ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17], 
      [18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31],[32], 
      [33],[34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45],[46],[47], 
      [48],[49],[50],[51],[52]) 
     ) As pvt ; 

要點:

的FiscalWeek值都必須是在[方括號]

中的樞紐必須使用別名「作爲列兵」並完成;

如果有人知道的方式,我可以寫FiscalWeek Between 1 And 52而不是國家所有的周請評論你的答案。

+0

正如我在頂端的評論回答,使用動態數據透視,所以你不需要編寫FiscalWeek IN 1-52。這裏有一個解決方案:https://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – Isaiah3015

+0

我沒有嘗試,它的工作,但我無法得到它下令周 – PeterH

+0

現在,你是一個一步近了,這裏是你的訂貨https://stackoverflow.com/questions/1122117/sql-dynamic-pivot-how-to-order-columns – Isaiah3015

1

這裏使用的是動態交叉錶轉動一個選項...

DECLARE 
    @WeekColumns VARCHAR(8000) = '', 
    @sql VARCHAR(8000) = '', 
    @DeBug BIT = 1;  -- change to 0 to execute & 1 to print. 

SELECT TOP 52 
    @WeekColumns = CONCAT(@WeekColumns, ', 
    [',t.n, '] = SUM(CASE WHEN sa.FiscalWeek = ', t.n, ' THEN sa.SalesExVAT ELSE 0 END)') 
FROM 
    dbo.tfn_Tally(52, 1) t; 

SET @sql = CONCAT(' 
SELECT 
    sa.BranchNo', 
    @WeekColumns, ' 
FROM 
    dbo.SalesAggregateWeek sa 
WHERE 
    sa.FiscalYear = 2016;') 

IF @DeBug = 1 
BEGIN 
    PRINT(@sql); 
END; 
ELSE 
BEGIN 
    EXEC(@sql); 
END; 

打印輸出...

SELECT 
    sa.BranchNo, 
    [1] = SUM(CASE WHEN sa.FiscalWeek = 1 THEN sa.SalesExVAT ELSE 0 END), 
    [2] = SUM(CASE WHEN sa.FiscalWeek = 2 THEN sa.SalesExVAT ELSE 0 END), 
    [3] = SUM(CASE WHEN sa.FiscalWeek = 3 THEN sa.SalesExVAT ELSE 0 END), 
    [4] = SUM(CASE WHEN sa.FiscalWeek = 4 THEN sa.SalesExVAT ELSE 0 END), 
    [5] = SUM(CASE WHEN sa.FiscalWeek = 5 THEN sa.SalesExVAT ELSE 0 END), 
    [6] = SUM(CASE WHEN sa.FiscalWeek = 6 THEN sa.SalesExVAT ELSE 0 END), 
    [7] = SUM(CASE WHEN sa.FiscalWeek = 7 THEN sa.SalesExVAT ELSE 0 END), 
    [8] = SUM(CASE WHEN sa.FiscalWeek = 8 THEN sa.SalesExVAT ELSE 0 END), 
    [9] = SUM(CASE WHEN sa.FiscalWeek = 9 THEN sa.SalesExVAT ELSE 0 END), 
    [10] = SUM(CASE WHEN sa.FiscalWeek = 10 THEN sa.SalesExVAT ELSE 0 END), 
    [11] = SUM(CASE WHEN sa.FiscalWeek = 11 THEN sa.SalesExVAT ELSE 0 END), 
    [12] = SUM(CASE WHEN sa.FiscalWeek = 12 THEN sa.SalesExVAT ELSE 0 END), 
    [13] = SUM(CASE WHEN sa.FiscalWeek = 13 THEN sa.SalesExVAT ELSE 0 END), 
    [14] = SUM(CASE WHEN sa.FiscalWeek = 14 THEN sa.SalesExVAT ELSE 0 END), 
    [15] = SUM(CASE WHEN sa.FiscalWeek = 15 THEN sa.SalesExVAT ELSE 0 END), 
    [16] = SUM(CASE WHEN sa.FiscalWeek = 16 THEN sa.SalesExVAT ELSE 0 END), 
    [17] = SUM(CASE WHEN sa.FiscalWeek = 17 THEN sa.SalesExVAT ELSE 0 END), 
    [18] = SUM(CASE WHEN sa.FiscalWeek = 18 THEN sa.SalesExVAT ELSE 0 END), 
    [19] = SUM(CASE WHEN sa.FiscalWeek = 19 THEN sa.SalesExVAT ELSE 0 END), 
    [20] = SUM(CASE WHEN sa.FiscalWeek = 20 THEN sa.SalesExVAT ELSE 0 END), 
    [21] = SUM(CASE WHEN sa.FiscalWeek = 21 THEN sa.SalesExVAT ELSE 0 END), 
    [22] = SUM(CASE WHEN sa.FiscalWeek = 22 THEN sa.SalesExVAT ELSE 0 END), 
    [23] = SUM(CASE WHEN sa.FiscalWeek = 23 THEN sa.SalesExVAT ELSE 0 END), 
    [24] = SUM(CASE WHEN sa.FiscalWeek = 24 THEN sa.SalesExVAT ELSE 0 END), 
    [25] = SUM(CASE WHEN sa.FiscalWeek = 25 THEN sa.SalesExVAT ELSE 0 END), 
    [26] = SUM(CASE WHEN sa.FiscalWeek = 26 THEN sa.SalesExVAT ELSE 0 END), 
    [27] = SUM(CASE WHEN sa.FiscalWeek = 27 THEN sa.SalesExVAT ELSE 0 END), 
    [28] = SUM(CASE WHEN sa.FiscalWeek = 28 THEN sa.SalesExVAT ELSE 0 END), 
    [29] = SUM(CASE WHEN sa.FiscalWeek = 29 THEN sa.SalesExVAT ELSE 0 END), 
    [30] = SUM(CASE WHEN sa.FiscalWeek = 30 THEN sa.SalesExVAT ELSE 0 END), 
    [31] = SUM(CASE WHEN sa.FiscalWeek = 31 THEN sa.SalesExVAT ELSE 0 END), 
    [32] = SUM(CASE WHEN sa.FiscalWeek = 32 THEN sa.SalesExVAT ELSE 0 END), 
    [33] = SUM(CASE WHEN sa.FiscalWeek = 33 THEN sa.SalesExVAT ELSE 0 END), 
    [34] = SUM(CASE WHEN sa.FiscalWeek = 34 THEN sa.SalesExVAT ELSE 0 END), 
    [35] = SUM(CASE WHEN sa.FiscalWeek = 35 THEN sa.SalesExVAT ELSE 0 END), 
    [36] = SUM(CASE WHEN sa.FiscalWeek = 36 THEN sa.SalesExVAT ELSE 0 END), 
    [37] = SUM(CASE WHEN sa.FiscalWeek = 37 THEN sa.SalesExVAT ELSE 0 END), 
    [38] = SUM(CASE WHEN sa.FiscalWeek = 38 THEN sa.SalesExVAT ELSE 0 END), 
    [39] = SUM(CASE WHEN sa.FiscalWeek = 39 THEN sa.SalesExVAT ELSE 0 END), 
    [40] = SUM(CASE WHEN sa.FiscalWeek = 40 THEN sa.SalesExVAT ELSE 0 END), 
    [41] = SUM(CASE WHEN sa.FiscalWeek = 41 THEN sa.SalesExVAT ELSE 0 END), 
    [42] = SUM(CASE WHEN sa.FiscalWeek = 42 THEN sa.SalesExVAT ELSE 0 END), 
    [43] = SUM(CASE WHEN sa.FiscalWeek = 43 THEN sa.SalesExVAT ELSE 0 END), 
    [44] = SUM(CASE WHEN sa.FiscalWeek = 44 THEN sa.SalesExVAT ELSE 0 END), 
    [45] = SUM(CASE WHEN sa.FiscalWeek = 45 THEN sa.SalesExVAT ELSE 0 END), 
    [46] = SUM(CASE WHEN sa.FiscalWeek = 46 THEN sa.SalesExVAT ELSE 0 END), 
    [47] = SUM(CASE WHEN sa.FiscalWeek = 47 THEN sa.SalesExVAT ELSE 0 END), 
    [48] = SUM(CASE WHEN sa.FiscalWeek = 48 THEN sa.SalesExVAT ELSE 0 END), 
    [49] = SUM(CASE WHEN sa.FiscalWeek = 49 THEN sa.SalesExVAT ELSE 0 END), 
    [50] = SUM(CASE WHEN sa.FiscalWeek = 50 THEN sa.SalesExVAT ELSE 0 END), 
    [51] = SUM(CASE WHEN sa.FiscalWeek = 51 THEN sa.SalesExVAT ELSE 0 END), 
    [52] = SUM(CASE WHEN sa.FiscalWeek = 52 THEN sa.SalesExVAT ELSE 0 END) 
FROM 
    dbo.SalesAggregateWeek sa 
WHERE 
    sa.FiscalYear = 2016;