2012-12-13 62 views
1

我有几个月的排。在我有1至31天的专栏。 我想在一个月的31天内在最后添加一列。寻找明智的每月总销售额

SELECT * FROM (
    SELECT DATENAME(month, date) AS SaleMonth, 
     DATEPART(dd,date) AS SaleDay FROM EnquiryMaster 
    ) p PIVOT 
    (COUNT (SaleDay) FOR 
    SaleDay 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])) AS pvt 

此代码显示31天的明智数据,但不显示总和。

回答

1

如果你想这是一列显示由一个月总有不幸的是,没有简单的方法。您可以使用这样的事情:

SELECT SaleMonth, 
    [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], 

    ([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]) TotalMonth 
FROM 
(
    SELECT DATENAME(month, date) AS SaleMonth, 
    DATEPART(dd,date) AS SaleDay 
    FROM EnquiryMaster 
) p 
PIVOT 
(
    COUNT (SaleDay) 
    FOR SaleDay 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]) 
) AS pvt 

SQL Fiddle with Demo

这可能是在动态SQL会更容易实现转动的数据的情况。通过使用动态SQL,您不必对这些值进行硬编码。

如果你使用动态SQL查询将类似于此:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(DATEPART(dd,date)) 
        from EnquiryMaster 
        group by DATEPART(dd,date) 
        order by DATEPART(dd,date) 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsTotal = STUFF((SELECT distinct '+' + QUOTENAME(DATEPART(dd,date)) 
        from EnquiryMaster 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 



set @query = 'SELECT SaleMonth,' + @cols + ', '+ @colsTotal+' as GrandTotal from 
      (
       SELECT DATENAME(month, date) AS SaleMonth, 
        DATEPART(dd,date) AS SaleDay 
       FROM EnquiryMaster 
      ) x 
      pivot 
      (
       count(SaleDay) 
       for SaleDay in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

或者另一个建议,我可能会交替的列标题是Month然后您可以在每个月执行GROUP BY with ROLLUP以获得总计行。

所以,你的新的结果集是这样的:

Day | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec 
------------------------------------------------------------------------------- 
1  | 12 | 34 | 5 | 3 | 3 | 2 | 32 | 0 | 9 | 87 | 23 | 54 
Total | .... 
0

尝试状况调查

SELECT * FROM (SELECT DATENAME(month, date) AS SaleMonth,DATEPART(dd,date) AS SaleDay FROM EnquiryMaster) p PIVOT (COUNT (SaleDay) FOR SaleDay BETWEEN 1 and 31) AS pvt 
0

尝试增加只是多了一个列到你的子查询:

SELECT * FROM (
    SELECT DATENAME(month, date) AS SaleMonth, 
     DATEPART(dd,date) AS SaleDay, COUNT(*) OVER (PARTITION BY DATENAME(month, date)) AS MonthlyTotal 
     FROM EnquiryMaster 
    ) p PIVOT 
    (COUNT (SaleDay) FOR 
    SaleDay 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])) AS pvt