2017-07-28 51 views
0

當前正在嘗試創建一個查詢,該查詢會爲我提供一個由代理人每天在全年進行的銷售。我已經設法讓整個專欄工作,但是每日銷售額並不是從查看原始數據,而是總結特定代理商在一天內完成的總銷售額,而是將所有行計算在內代理列出並輸出。 代碼如下:SQL - 交叉選項卡。一個字段的總和,而不是列中的計數行

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(20), [ENTRY_DATE], 106)) 
        FROM [Sales_Data] with (NoLock) 
       where([ENTRY_DATE] between '01-Jan-2017' and '01-Jul-2017' 


       Group By [ENTRY_DATE] 
       order by [ENTRY_DATE] 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 

' SELECT 
    [Advisor_Name]                AS [Advisor_Name] 
,[Line_Managers_Name]               AS [Line_Managers_Name] 
,[SALE_TYPE] 
,[Total] 
,'+ @cols +' 

    From (
      Select 
        sum([SALES]) 
           over(partition by [Advisor_Name], [Line_Managers_Name], [SALE_TYPE]) 
             [Total] 
           , [ENTRY_DATE] 
           , [Advisor_Name] 
           ,  [Line_Managers_Name] 
           , [SALE_TYPE] 


      From [Sales_Data] a with (NoLock)   



     )  x 

    pivot 

    (
             Count([ENTRY_DATE]) 
             for [ENTRY_DATE] in (' + @cols + ') 
    ) p 


Order by [Advisor_Name],  [Line_Managers_Name],  [CHANNEL]   

' 

execute(@query) 

如果我不能改變我的計劃,而不是上改變源數據給我通過網上銷售信息行,而不是聚集成加法,不幸的是有些行的查詢可能有一個客戶與-1銷售表示退款,我不知道如何適應這些,我試過選擇不同的,選擇(選擇不同.....)有count(*)= 1,但似乎沒有任何工作要做。

回答

0

我也修改了我們動態生成的SQL以生成新的輸出。

DECLARE @cols AS NVARCHAR(MAX) 
DECLARE @colsForPivot AS NVARCHAR(MAX) 
DECLARE @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',ISNULL(' + QUOTENAME(convert(varchar(20), [ENTRY_DATE], 106)) + ',0)' 
        FROM [Sales_Data] with (NoLock) 
       where([ENTRY_DATE] between '01-Jan-2017' and '01-Jul-2017') 
       Group By [ENTRY_DATE] 
       order by [ENTRY_DATE] 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

select @colsForPivot = STUFF((SELECT ',' + QUOTENAME(convert(varchar(20), [ENTRY_DATE], 106)) 
       FROM [Sales_Data] with (NoLock) 
      where([ENTRY_DATE] between '01-Jan-2017' and '01-Jul-2017') 
      Group By [ENTRY_DATE] 
      order by [ENTRY_DATE] 
    FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,'') 

set @query = 

'SELECT 

[Advisor_Name], [Line_Managers_Name], [SALE_TYPE], ISNULL(TotalSales,0), ' 
+ @cols + ' 

    From (
      Select distinct 
        sum([SALES]) 
           over(partition by [Advisor_Name], [Line_Managers_Name], [SALE_TYPE], [ENTRY_DATE]) 
             [Total] 
           , [ENTRY_DATE] 
           , [Advisor_Name] 
           ,  [Line_Managers_Name] 
           , [SALE_TYPE], 
sum([SALES]) 
over(partition by [Advisor_Name], [Line_Managers_Name], [SALE_TYPE]) as TotalSales 


      From [Sales_Data] a with (NoLock)   



     )  x 

    pivot 

    (
             sum([Total]) 
             for [ENTRY_DATE] in (' + @colsForPivot + ') 
    ) p 


Order by [Advisor_Name],  [Line_Managers_Name]  

' 

print(@query) 
+0

非常感謝你,這太棒了! 有一個小小的錯誤,如果你可以修復會很長的路要命名後面的一個孩子,是否有任何方法用0代替日期列中的NULL條目? 我們的目標是能夠將其直接複製到excel中,但隨着我在Excel中嘗試查找和替換的條目數量(大約8000名代理超過6個月)幾乎使我的系統崩潰。 – MichaelL

+0

當然可以。任何你想要替換的列都是null,就這樣做。 ISNULL(columnName,0)。如果列ia NULL,則會重新調用0,否則重新調用列中的值。 – SQLAndOtherStuffGuy

+0

請給孩子「戴夫」打電話! – SQLAndOtherStuffGuy

0

你可以試試這個,我不得不嘗試模擬你的數據,但它看起來像我得到了很好的結果。

SELECT 
* 
    From (
Select distinct 
sum([Total]) 
over(partition by [Advisor_Name], [Line_Managers_Name], [SALE_TYPE], [ENTRY_DATE]) as Total 
, [ENTRY_DATE] 
, [Advisor_Name] 
,  [Line_Managers_Name] 
, [SALE_TYPE], 
sum([Total]) 
over(partition by [Advisor_Name], [Line_Managers_Name], [SALE_TYPE]) as TotalSales 

      From [Sales_Data] a with (NoLock)   

     )  x 
    pivot 
    (
      Sum(Total) 
      for [ENTRY_DATE] in ([01 Jan 2017],[02 Jan 2017],[03 Jan 2017]) 
    ) p 


Order by [Advisor_Name],  [Line_Managers_Name] 
相關問題