2017-07-28 43 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] 
相关问题